# SOME DESCRIPTIVE TITLE. # Copyright (C) 2024, OpenStack Foundation # This file is distributed under the same license as the Swift package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: Swift 2.35.0.dev62\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-11-18 20:34+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/api/authentication.rst:3 msgid "Authentication" msgstr "" #: ../../source/api/authentication.rst:5 msgid "" "The owner of an Object Storage account controls access to that account and " "its containers and objects. An owner is the user who has the ''admin'' role " "for that tenant. The tenant is also known as the project or account. As the " "account owner, you can modify account metadata and create, modify, and " "delete containers and objects." msgstr "" #: ../../source/api/authentication.rst:11 msgid "" "To identify yourself as the account owner, include an authentication token " "in the ''X-Auth-Token'' header in the API request." msgstr "" #: ../../source/api/authentication.rst:14 msgid "" "Depending on the token value in the ''X-Auth-Token'' header, one of the " "following actions occur:" msgstr "" #: ../../source/api/authentication.rst:17 msgid "''X-Auth-Token'' contains the token for the account owner." msgstr "" #: ../../source/api/authentication.rst:19 msgid "" "The request is permitted and has full access to make changes to the account." msgstr "" #: ../../source/api/authentication.rst:22 msgid "" "The ''X-Auth-Token'' header is omitted or it contains a token for a non-" "owner or a token that is not valid." msgstr "" #: ../../source/api/authentication.rst:25 msgid "The request fails with a 401 Unauthorized or 403 Forbidden response." msgstr "" #: ../../source/api/authentication.rst:27 msgid "" "You have no access to accounts or containers, unless an access control list " "(ACL) explicitly grants access." msgstr "" #: ../../source/api/authentication.rst:30 msgid "" "The account owner can grant account and container access to users through " "access control lists (ACLs)." msgstr "" #: ../../source/api/authentication.rst:33 msgid "" "In addition, it is possible to provide an additional token in the ''X-" "Service-Token'' header. More information about how this is used is in :doc:" "`../overview_backing_store`." msgstr "" #: ../../source/api/authentication.rst:37 msgid "" "The following list describes the authentication services that you can use " "with Object Storage:" msgstr "" #: ../../source/api/authentication.rst:40 msgid "" "OpenStack Identity (keystone): For Object Storage, account is synonymous " "with project or tenant ID." msgstr "" #: ../../source/api/authentication.rst:43 msgid "" "Tempauth middleware: Object Storage includes this middleware. User and " "account management is performed in Object Storage itself." msgstr "" #: ../../source/api/authentication.rst:46 msgid "" "Swauth middleware: Stored in github, this custom middleware is modeled on " "Tempauth. Usage is similar to Tempauth." msgstr "" #: ../../source/api/authentication.rst:49 msgid "Other custom middleware: Write it yourself to fit your environment." msgstr "" #: ../../source/api/authentication.rst:51 msgid "" "Specifically, you use the ''X-Auth-Token'' header to pass an authentication " "token to an API request." msgstr "" #: ../../source/api/authentication.rst:54 msgid "" "Authentication tokens expire after a time period that the authentication " "service defines. When a token expires, use of the token causes requests to " "fail with a 401 Unauthorized response. To continue, you must obtain a new " "token." msgstr "" #: ../../source/api/bulk-delete.rst:5 msgid "Bulk delete" msgstr "" #: ../../source/api/bulk-delete.rst:7 ../../source/api/static-website.rst:7 msgid "" "To discover whether your Object Storage system supports this feature, see :" "ref:`discoverability`. Alternatively, check with your service provider." msgstr "" #: ../../source/api/bulk-delete.rst:10 msgid "" "With bulk delete, you can delete up to 10,000 objects or containers " "(configurable) in one request." msgstr "" #: ../../source/api/bulk-delete.rst:14 msgid "Bulk delete request" msgstr "" #: ../../source/api/bulk-delete.rst:16 msgid "" "To perform a bulk delete operation, add the ``bulk-delete`` query parameter " "to the path of a ``POST`` or ``DELETE`` operation." msgstr "" #: ../../source/api/bulk-delete.rst:21 msgid "The ``DELETE`` operation is supported for backwards compatibility." msgstr "" #: ../../source/api/bulk-delete.rst:23 msgid "" "The path is the account, such as ``/v1/12345678912345``, that contains the " "objects and containers." msgstr "" #: ../../source/api/bulk-delete.rst:26 msgid "" "In the request body of the ``POST`` or ``DELETE`` operation, list the " "objects or containers to be deleted. Separate each name with a newline " "character. You can include a maximum of 10,000 items (configurable) in the " "list." msgstr "" #: ../../source/api/bulk-delete.rst:31 msgid "In addition, you must:" msgstr "" #: ../../source/api/bulk-delete.rst:33 msgid "UTF-8-encode and then URL-encode the names." msgstr "" #: ../../source/api/bulk-delete.rst:35 msgid "" "To indicate an object, specify the container and object name as: " "``CONTAINER_NAME``/``OBJECT_NAME``." msgstr "" #: ../../source/api/bulk-delete.rst:38 msgid "" "To indicate a container, specify the container name as: ``CONTAINER_NAME``. " "Make sure that the container is empty. If it contains objects, Object " "Storage cannot delete the container." msgstr "" #: ../../source/api/bulk-delete.rst:42 msgid "Set the ``Content-Type`` request header to ``text/plain``." msgstr "" #: ../../source/api/bulk-delete.rst:45 msgid "Bulk delete response" msgstr "" #: ../../source/api/bulk-delete.rst:47 msgid "" "When Object Storage processes the request, it performs multiple sub-" "operations. Even if all sub-operations fail, the operation returns a 200 " "status. The bulk operation returns a response body that contains details " "that indicate which sub-operations have succeeded and failed. Some sub-" "operations might succeed while others fail. Examine the response body to " "determine the results of each delete sub-operation." msgstr "" #: ../../source/api/bulk-delete.rst:54 msgid "" "You can set the ``Accept`` request header to one of the following values to " "define the response format:" msgstr "" #: ../../source/api/bulk-delete.rst:58 msgid "" "Formats response as plain text. If you omit the ``Accept`` header, ``text/" "plain`` is the default." msgstr "" #: ../../source/api/bulk-delete.rst:59 msgid "``text/plain``" msgstr "" #: ../../source/api/bulk-delete.rst:62 msgid "Formats response as JSON." msgstr "" #: ../../source/api/bulk-delete.rst:62 msgid "``application/json``" msgstr "" #: ../../source/api/bulk-delete.rst:65 msgid "Formats response as XML." msgstr "" #: ../../source/api/bulk-delete.rst:65 msgid "``application/xml`` or ``text/xml``" msgstr "" #: ../../source/api/bulk-delete.rst:67 msgid "The response body contains the following information:" msgstr "" #: ../../source/api/bulk-delete.rst:69 msgid "The number of files actually deleted." msgstr "" #: ../../source/api/bulk-delete.rst:71 msgid "The number of not found objects." msgstr "" #: ../../source/api/bulk-delete.rst:73 msgid "" "Errors. A list of object names and associated error statuses for the objects " "that failed to delete. The format depends on the value that you set in the " "``Accept`` header." msgstr "" #: ../../source/api/bulk-delete.rst:77 msgid "" "The following bulk delete response is in ``application/xml`` format. In this " "example, the ``mycontainer`` container is not empty, so it cannot be deleted." msgstr "" #: ../../source/api/container_quotas.rst:5 msgid "Container quotas" msgstr "" #: ../../source/api/container_quotas.rst:7 msgid "" "You can set quotas on the size and number of objects stored in a container " "by setting the following metadata:" msgstr "" #: ../../source/api/container_quotas.rst:10 msgid "" "``X-Container-Meta-Quota-Bytes``. The size, in bytes, of objects that can be " "stored in a container." msgstr "" #: ../../source/api/container_quotas.rst:13 msgid "" "``X-Container-Meta-Quota-Count``. The number of objects that can be stored " "in a container." msgstr "" #: ../../source/api/container_quotas.rst:16 msgid "" "When you exceed a container quota, subsequent requests to create objects " "fail with a 413 Request Entity Too Large error." msgstr "" #: ../../source/api/container_quotas.rst:19 msgid "" "The Object Storage system uses an eventual consistency model. When you " "create a new object, the container size and object count might not be " "immediately updated. Consequently, you might be allowed to create objects " "even though you have actually exceeded the quota." msgstr "" #: ../../source/api/container_quotas.rst:24 msgid "" "At some later time, the system updates the container size and object count " "to the actual values. At this time, subsequent requests fails. In addition, " "if you are currently under the ``X-Container-Meta-Quota-Bytes`` limit and a " "request uses chunked transfer encoding, the system cannot know if the " "request will exceed the quota so the system allows the request. However, " "once the quota is exceeded, any subsequent uploads that use chunked transfer " "encoding fail." msgstr "" #: ../../source/api/discoverability.rst:3 msgid "Discoverability" msgstr "" #: ../../source/api/discoverability.rst:5 msgid "" "Your Object Storage system might not enable all features that you read about " "because your service provider chooses which features to enable." msgstr "" #: ../../source/api/discoverability.rst:7 msgid "" "To discover which features are enabled in your Object Storage system, use " "the ``/info`` request. However, your service provider might have disabled " "the ``/info`` request, or you might be using an older version that does not " "support the ``/info`` request." msgstr "" #: ../../source/api/discoverability.rst:12 msgid "" "To use the ``/info`` request, send a **GET** request using the ``/info`` " "path to the Object Store endpoint as shown in this example:" msgstr "" #: ../../source/api/discoverability.rst:19 msgid "This example shows a truncated response body:" msgstr "" #: ../../source/api/discoverability.rst:35 msgid "" "This output shows that the Object Storage system has enabled the static " "website and temporary URL features." msgstr "" #: ../../source/api/form_post_middleware.rst:3 msgid "Form POST middleware" msgstr "" #: ../../source/api/form_post_middleware.rst:5 msgid "" "To discover whether your Object Storage system supports this feature, check " "with your service provider or send a **GET** request using the :file:`/info` " "path." msgstr "" #: ../../source/api/form_post_middleware.rst:9 msgid "" "You can upload objects directly to the Object Storage system from a browser " "by using the form **POST** middleware. This middleware uses account or " "container secret keys to generate a cryptographic signature for the request. " "This means that you do not need to send an authentication token in the ``X-" "Auth-Token`` header to perform the request." msgstr "" #: ../../source/api/form_post_middleware.rst:15 msgid "" "The form **POST** middleware uses the same secret keys as the temporary URL " "middleware uses. For information about how to set these keys, see :ref:" "`secret_keys`." msgstr "" #: ../../source/api/form_post_middleware.rst:19 msgid "" "For information about the form **POST** middleware configuration options, " "see :ref:`formpost` in the *Source Documentation*." msgstr "" #: ../../source/api/form_post_middleware.rst:23 msgid "Form POST format" msgstr "" #: ../../source/api/form_post_middleware.rst:25 msgid "" "To upload objects to a cluster, you can use an HTML form **POST** request." msgstr "" #: ../../source/api/form_post_middleware.rst:28 msgid "The format of the form **POST** request is:" msgstr "" #: ../../source/api/form_post_middleware.rst:30 msgid "**Example 1.14. Form POST format**" msgstr "" #: ../../source/api/form_post_middleware.rst:48 msgid "**action=\"SWIFT_URL\"**" msgstr "" #: ../../source/api/form_post_middleware.rst:50 msgid "" "Set to full URL where the objects are to be uploaded. The names of uploaded " "files are appended to the specified *SWIFT_URL*. So, you can upload directly " "to the root of a container with a URL like:" msgstr "" #: ../../source/api/form_post_middleware.rst:58 msgid "" "Optionally, you can include an object prefix to separate uploads, such as:" msgstr "" #: ../../source/api/form_post_middleware.rst:66 msgid "**method=\"POST\"**" msgstr "" #: ../../source/api/form_post_middleware.rst:68 msgid "Must be ``POST``." msgstr "" #: ../../source/api/form_post_middleware.rst:71 msgid "**enctype=\"multipart/form-data\"**" msgstr "" #: ../../source/api/form_post_middleware.rst:73 msgid "Must be ``multipart/form-data``." msgstr "" #: ../../source/api/form_post_middleware.rst:76 msgid "**name=\"redirect\" value=\"REDIRECT_URL\"**" msgstr "" #: ../../source/api/form_post_middleware.rst:78 msgid "" "Redirects the browser to the *REDIRECT_URL* after the upload completes. The " "URL has status and message query parameters added to it, which specify the " "HTTP status code for the upload and an optional error message. The 2\\ *nn* " "status code indicates success." msgstr "" #: ../../source/api/form_post_middleware.rst:83 msgid "" "The *REDIRECT_URL* can be an empty string. If so, the ``Location`` response " "header is not set." msgstr "" #: ../../source/api/form_post_middleware.rst:86 msgid "**name=\"max\\_file\\_size\" value=\"BYTES\"**" msgstr "" #: ../../source/api/form_post_middleware.rst:88 msgid "" "Required. Indicates the size, in bytes, of the maximum single file upload." msgstr "" #: ../../source/api/form_post_middleware.rst:91 msgid "**name=\"max\\_file\\_count\" value= \"COUNT\"**" msgstr "" #: ../../source/api/form_post_middleware.rst:93 msgid "" "Required. Indicates the maximum number of files that can be uploaded with " "the form." msgstr "" #: ../../source/api/form_post_middleware.rst:97 msgid "**name=\"expires\" value=\"UNIX_TIMESTAMP\"**" msgstr "" #: ../../source/api/form_post_middleware.rst:99 msgid "" "The UNIX timestamp that specifies the time before which the form must be " "submitted before it becomes no longer valid." msgstr "" #: ../../source/api/form_post_middleware.rst:103 msgid "**name=\"signature\" value=\"HMAC\"**" msgstr "" #: ../../source/api/form_post_middleware.rst:105 msgid "The HMAC-SHA1 signature of the form." msgstr "" #: ../../source/api/form_post_middleware.rst:108 msgid "**type=\"file\" name=\"FILE_NAME\"**" msgstr "" #: ../../source/api/form_post_middleware.rst:110 msgid "" "File name of the file to be uploaded. You can include from one to the " "``max_file_count`` value of files." msgstr "" #: ../../source/api/form_post_middleware.rst:113 msgid "" "The file attributes must appear after the other attributes to be processed " "correctly." msgstr "" #: ../../source/api/form_post_middleware.rst:116 msgid "" "If attributes appear after the file attributes, they are not sent with the " "sub-request because all attributes in the file cannot be parsed on the " "server side unless the whole file is read into memory; the server does not " "have enough memory to service these requests. Attributes that follow the " "file attributes are ignored." msgstr "" #: ../../source/api/form_post_middleware.rst:122 msgid "" "Optionally, if you want the uploaded files to be temporary you can set x-" "delete-at or x-delete-after attributes by adding one of these as a form " "input:" msgstr "" #: ../../source/api/form_post_middleware.rst:130 msgid "**type= \"submit\"**" msgstr "" #: ../../source/api/form_post_middleware.rst:132 msgid "Must be ``submit``." msgstr "" #: ../../source/api/form_post_middleware.rst:135 msgid "HMAC-SHA1 signature for form POST" msgstr "" #: ../../source/api/form_post_middleware.rst:137 msgid "" "Form **POST** middleware uses an HMAC-SHA1 cryptographic signature. This " "signature includes these elements from the form:" msgstr "" #: ../../source/api/form_post_middleware.rst:140 msgid "" "The path. Starting with ``/v1/`` onwards and including a container name and, " "optionally, an object prefix. In `Example 1.15`, \"HMAC-SHA1 signature for " "form POST\" the path is ``/v1/my_account/container/object_prefix``. Do not " "URL-encode the path at this stage." msgstr "" #: ../../source/api/form_post_middleware.rst:147 msgid "A redirect URL. If there is no redirect URL, use the empty string." msgstr "" #: ../../source/api/form_post_middleware.rst:149 msgid "" "Maximum file size. In `Example 1.15`, \"HMAC-SHA1 signature for form POST\" " "the ``max_file_size`` is ``104857600`` bytes." msgstr "" #: ../../source/api/form_post_middleware.rst:153 msgid "" "The maximum number of objects to upload. In `Example 1.15`, \"HMAC-SHA1 " "signature for form POST\" ``max_file_count`` is ``10``." msgstr "" #: ../../source/api/form_post_middleware.rst:157 msgid "" "Expiry time. In `Example 1.15, \"HMAC-SHA1 signature for form POST\" the " "expiry time is set to ``600`` seconds into the future." msgstr "" #: ../../source/api/form_post_middleware.rst:161 msgid "" "The secret key. Set as the ``X-Account-Meta-Temp-URL-Key`` header value for " "accounts or ``X-Container-Meta-Temp-URL-Key`` header value for containers. " "See :ref:`secret_keys` for more information." msgstr "" #: ../../source/api/form_post_middleware.rst:165 msgid "" "The following example code generates a signature for use with form **POST**:" msgstr "" #: ../../source/api/form_post_middleware.rst:168 msgid "**Example 1.15. HMAC-SHA1 signature for form POST**" msgstr "" #: ../../source/api/form_post_middleware.rst:186 #: ../../source/api/temporary_url_middleware.rst:181 msgid "" "For more information, see `RFC 2104: HMAC: Keyed-Hashing for Message " "Authentication `__." msgstr "" #: ../../source/api/form_post_middleware.rst:190 msgid "Form POST example" msgstr "" #: ../../source/api/form_post_middleware.rst:192 msgid "" "The following example shows how to submit a form by using a cURL command. In " "this example, the object prefix is ``photos/`` and the file being uploaded " "is called ``flower.jpg``." msgstr "" #: ../../source/api/form_post_middleware.rst:196 msgid "" "This example uses the **swift-form-signature** script to compute the " "``expires`` and ``signature`` values." msgstr "" #: ../../source/api/large_objects.rst:3 msgid "Large objects" msgstr "" #: ../../source/api/large_objects.rst:5 msgid "" "By default, the content of an object cannot be greater than 5 GB. However, " "you can use a number of smaller objects to construct a large object. The " "large object is comprised of two types of objects:" msgstr "" #: ../../source/api/large_objects.rst:9 msgid "" "**Segment objects** store the object content. You can divide your content " "into segments, and upload each segment into its own segment object. Segment " "objects do not have any special features. You create, update, download, and " "delete segment objects just as you would normal objects." msgstr "" #: ../../source/api/large_objects.rst:15 msgid "" "A **manifest object** links the segment objects into one logical large " "object. When you download a manifest object, Object Storage concatenates and " "returns the contents of the segment objects in the response body of the " "request. This behavior extends to the response headers returned by **GET** " "and **HEAD** requests. The ``Content-Length`` response header value is the " "total size of all segment objects. Object Storage calculates the ``ETag`` " "response header value by taking the ``ETag`` value of each segment, " "concatenating them together, and returning the MD5 checksum of the result. " "The manifest object types are:" msgstr "" #: ../../source/api/large_objects.rst:27 msgid "" "The manifest object content is an ordered list of the names of the segment " "objects in JSON format." msgstr "" #: ../../source/api/large_objects.rst:28 msgid "**Static large objects**" msgstr "" #: ../../source/api/large_objects.rst:31 msgid "" "The manifest object has a ``X-Object-Manifest`` metadata header. The value " "of this header is ``{container}/{prefix}``, where ``{container}`` is the " "name of the container where the segment objects are stored, and ``{prefix}`` " "is a string that all segment objects have in common. The manifest object " "should have no content. However, this is not enforced." msgstr "" #: ../../source/api/large_objects.rst:36 msgid "**Dynamic large objects**" msgstr "" #: ../../source/api/large_objects.rst:39 msgid "Note" msgstr "" #: ../../source/api/large_objects.rst:41 msgid "" "If you make a **COPY** request by using a manifest object as the source, the " "new object is a normal, and not a segment, object. If the total size of the " "source segment objects exceeds 5 GB, the **COPY** request fails. However, " "you can make a duplicate of the manifest object and this new object can be " "larger than 5 GB." msgstr "" #: ../../source/api/large_objects.rst:48 msgid "Static large objects" msgstr "" #: ../../source/api/large_objects.rst:50 msgid "" "To create a static large object, divide your content into pieces and create " "(upload) a segment object to contain each piece." msgstr "" #: ../../source/api/large_objects.rst:53 msgid "" "Create a manifest object. Include the ``multipart-manifest=put`` query " "parameter at the end of the manifest object name to indicate that this is a " "manifest object." msgstr "" #: ../../source/api/large_objects.rst:57 msgid "" "The body of the **PUT** request on the manifest object comprises a json " "list, where each element is an object representing a segment. These objects " "may contain the following attributes:" msgstr "" #: ../../source/api/large_objects.rst:61 msgid "" "``path`` (required). The container and object name in the format: " "``{container-name}/{object-name}``" msgstr "" #: ../../source/api/large_objects.rst:64 msgid "" "``etag`` (optional). If provided, this value must match the ``ETag`` of the " "segment object. This was included in the response headers when the segment " "was created. Generally, this will be the MD5 sum of the segment." msgstr "" #: ../../source/api/large_objects.rst:69 msgid "" "``size_bytes`` (optional). The size of the segment object. If provided, this " "value must match the ``Content-Length`` of that object." msgstr "" #: ../../source/api/large_objects.rst:72 msgid "" "``range`` (optional). The subset of the referenced object that should be " "used for segment data. This behaves similar to the ``Range`` header. If " "omitted, the entire object will be used." msgstr "" #: ../../source/api/large_objects.rst:76 msgid "" "Providing the optional ``etag`` and ``size_bytes`` attributes for each " "segment ensures that the upload cannot corrupt your data." msgstr "" #: ../../source/api/large_objects.rst:79 msgid "**Example Static large object manifest list**" msgstr "" #: ../../source/api/large_objects.rst:81 msgid "" "This example shows three segment objects. You can use several containers and " "the object names do not have to conform to a specific pattern, in contrast " "to dynamic large objects." msgstr "" #: ../../source/api/large_objects.rst:107 msgid "" "The ``Content-Length`` request header must contain the length of the json " "content—not the length of the segment objects. However, after the **PUT** " "operation completes, the ``Content-Length`` metadata is set to the total " "length of all the object segments. When using the ``ETag`` request header in " "a **PUT** operation, it must contain the MD5 checksum of the concatenated " "``ETag`` values of the object segments. You can also set the ``Content-" "Type`` request header and custom object metadata." msgstr "" #: ../../source/api/large_objects.rst:115 msgid "" "When the **PUT** operation sees the ``multipart-manifest=put`` query " "parameter, it reads the request body and verifies that each segment object " "exists and that the sizes and ETags match. If there is a mismatch, the " "**PUT** operation fails." msgstr "" #: ../../source/api/large_objects.rst:120 msgid "" "This verification process can take a long time to complete, particularly as " "the number of segments increases. You may include a ``heartbeat=on`` query " "parameter to have the server:" msgstr "" #: ../../source/api/large_objects.rst:124 msgid "send a ``202 Accepted`` response before it begins validating segments," msgstr "" #: ../../source/api/large_objects.rst:125 msgid "" "periodically send whitespace characters to keep the connection alive, and" msgstr "" #: ../../source/api/large_objects.rst:126 msgid "send a final response code in the body." msgstr "" #: ../../source/api/large_objects.rst:129 msgid "" "The server may still immediately respond with ``400 Bad Request`` if it can " "determine that the request is invalid before making backend requests." msgstr "" #: ../../source/api/large_objects.rst:133 msgid "" "If everything matches, the manifest object is created. The ``X-Static-Large-" "Object`` metadata is set to ``true`` indicating that this is a static object " "manifest." msgstr "" #: ../../source/api/large_objects.rst:137 msgid "" "Normally when you perform a **GET** operation on the manifest object, the " "response body contains the concatenated content of the segment objects. To " "download the manifest list, use the ``multipart-manifest=get`` query " "parameter. The resulting list is not formatted the same as the manifest you " "originally used in the **PUT** operation." msgstr "" #: ../../source/api/large_objects.rst:144 msgid "" "If you use the **DELETE** operation on a manifest object, the manifest " "object is deleted. The segment objects are not affected. However, if you add " "the ``multipart-manifest=delete`` query parameter, the segment objects are " "deleted and if all are successfully deleted, the manifest object is also " "deleted." msgstr "" #: ../../source/api/large_objects.rst:150 msgid "" "To change the manifest, use a **PUT** operation with the ``multipart-" "manifest=put`` query parameter. This request creates a manifest object. You " "can also update the object metadata in the usual way." msgstr "" #: ../../source/api/large_objects.rst:156 msgid "Dynamic large objects" msgstr "" #: ../../source/api/large_objects.rst:158 msgid "" "You must segment objects that are larger than 5 GB before you can upload " "them. You then upload the segment objects like you would any other object " "and create a dynamic large manifest object. The manifest object tells Object " "Storage how to find the segment objects that comprise the large object. The " "segments remain individually addressable, but retrieving the manifest object " "streams all the segments concatenated. There is no limit to the number of " "segments that can be a part of a single large object, but ``Content-Length`` " "is included in **GET** or **HEAD** response only if the number of segments " "is smaller than container listing limit. In other words, the number of " "segments that fit within a single container listing page." msgstr "" #: ../../source/api/large_objects.rst:170 msgid "" "To ensure the download works correctly, you must upload all the object " "segments to the same container and ensure that each object name is prefixed " "in such a way that it sorts in the order in which it should be concatenated. " "You also create and upload a manifest file. The manifest file is a zero-byte " "file with the extra ``X-Object-Manifest`` ``{container}/{prefix}`` header, " "where ``{container}`` is the container the object segments are in and " "``{prefix}`` is the common prefix for all the segments. You must UTF-8-" "encode and then URL-encode the container and common prefix in the ``X-Object-" "Manifest`` header." msgstr "" #: ../../source/api/large_objects.rst:180 msgid "" "It is best to upload all the segments first and then create or update the " "manifest. With this method, the full object is not available for downloading " "until the upload is complete. Also, you can upload a new set of segments to " "a second location and update the manifest to point to this new location. " "During the upload of the new segments, the original manifest is still " "available to download the first set of segments." msgstr "" #: ../../source/api/large_objects.rst:189 msgid "" "When updating a manifest object using a POST request, a ``X-Object-" "Manifest`` header must be included for the object to continue to behave as a " "manifest object." msgstr "" #: ../../source/api/large_objects.rst:193 msgid "**Example Upload segment of large object request: HTTP**" msgstr "" #: ../../source/api/large_objects.rst:205 msgid "" "No response body is returned. A status code of 2\\ *``nn``* (between 200 and " "299, inclusive) indicates a successful write; status 411 Length Required " "denotes a missing ``Content-Length`` or ``Content-Type`` header in the " "request. If the MD5 checksum of the data written to the storage system does " "NOT match the (optionally) supplied ETag value, a 422 Unprocessable Entity " "response is returned." msgstr "" #: ../../source/api/large_objects.rst:212 msgid "" "You can continue uploading segments like this example shows, prior to " "uploading the manifest." msgstr "" #: ../../source/api/large_objects.rst:215 msgid "**Example Upload next segment of large object request: HTTP**" msgstr "" #: ../../source/api/large_objects.rst:227 msgid "" "Next, upload the manifest you created that indicates the container the " "object segments reside within. Note that uploading additional segments after " "the manifest is created causes the concatenated object to be that much " "larger but you do not need to recreate the manifest file for subsequent " "additional segments." msgstr "" #: ../../source/api/large_objects.rst:233 msgid "**Example Upload manifest request: HTTP**" msgstr "" #: ../../source/api/large_objects.rst:245 msgid "**Example Upload manifest response: HTTP**" msgstr "" #: ../../source/api/large_objects.rst:252 msgid "" "The ``Content-Type`` in the response for a **GET** or **HEAD** on the " "manifest is the same as the ``Content-Type`` set during the **PUT** request " "that created the manifest. You can easily change the ``Content-Type`` by " "reissuing the **PUT** request." msgstr "" #: ../../source/api/large_objects.rst:258 msgid "Comparison of static and dynamic large objects" msgstr "" #: ../../source/api/large_objects.rst:260 msgid "" "While static and dynamic objects have similar behavior, here are their " "differences:" msgstr "" #: ../../source/api/large_objects.rst:264 msgid "End-to-end integrity" msgstr "" #: ../../source/api/large_objects.rst:266 msgid "" "With static large objects, integrity can be assured. The list of segments " "may include the MD5 checksum (``ETag``) of each segment. You cannot upload " "the manifest object if the ``ETag`` in the list differs from the uploaded " "segment object. If a segment is somehow lost, an attempt to download the " "manifest object results in an error." msgstr "" #: ../../source/api/large_objects.rst:272 msgid "" "With dynamic large objects, integrity is not guaranteed. The eventual " "consistency model means that although you have uploaded a segment object, it " "might not appear in the container listing until later. If you download the " "manifest before it appears in the container, it does not form part of the " "content returned in response to a **GET** request." msgstr "" #: ../../source/api/large_objects.rst:279 msgid "Upload Order" msgstr "" #: ../../source/api/large_objects.rst:281 msgid "" "With static large objects, you must upload the segment objects before you " "upload the manifest object." msgstr "" #: ../../source/api/large_objects.rst:284 msgid "" "With dynamic large objects, you can upload manifest and segment objects in " "any order. In case a premature download of the manifest occurs, we recommend " "users upload the manifest object after the segments. However, the system " "does not enforce the order." msgstr "" #: ../../source/api/large_objects.rst:290 msgid "Removal or addition of segment objects" msgstr "" #: ../../source/api/large_objects.rst:292 msgid "" "With static large objects, you cannot add or remove segment objects from the " "manifest. However, you can create a completely new manifest object of the " "same name with a different manifest list." msgstr "" #: ../../source/api/large_objects.rst:297 msgid "" "With dynamic large objects, you can upload new segment objects or remove " "existing segments. The names must simply match the ``{prefix}`` supplied in " "``X-Object-Manifest``." msgstr "" #: ../../source/api/large_objects.rst:302 msgid "Segment object size and number" msgstr "" #: ../../source/api/large_objects.rst:304 msgid "" "With static large objects, the segment objects must be at least 1 byte in " "size. However, if the segment objects are less than 1MB (by default), the " "SLO download is (by default) rate limited. At most, 1000 segments are " "supported (by default) and the manifest has a limit (by default) of 2MB in " "size." msgstr "" #: ../../source/api/large_objects.rst:310 msgid "With dynamic large objects, segment objects can be any size." msgstr "" #: ../../source/api/large_objects.rst:313 msgid "Segment object container name" msgstr "" #: ../../source/api/large_objects.rst:315 msgid "" "With static large objects, the manifest list includes the container name of " "each object. Segment objects can be in different containers." msgstr "" #: ../../source/api/large_objects.rst:318 msgid "" "With dynamic large objects, all segment objects must be in the same " "container." msgstr "" #: ../../source/api/large_objects.rst:321 msgid "Manifest object metadata" msgstr "" #: ../../source/api/large_objects.rst:323 msgid "" "With static large objects, the manifest object has ``X-Static-Large-Object`` " "set to ``true``. You do not set this metadata directly. Instead the system " "sets it when you **PUT** a static manifest object." msgstr "" #: ../../source/api/large_objects.rst:328 msgid "" "With dynamic large objects, the ``X-Object-Manifest`` value is the " "``{container}/{prefix}``, which indicates where the segment objects are " "located. You supply this request header in the **PUT** operation." msgstr "" #: ../../source/api/large_objects.rst:334 msgid "Copying the manifest object" msgstr "" #: ../../source/api/large_objects.rst:336 msgid "" "The semantics are the same for both static and dynamic large objects. When " "copying large objects, the **COPY** operation does not create a manifest " "object but a normal object with content same as what you would get on a " "**GET** request to the original manifest object." msgstr "" #: ../../source/api/large_objects.rst:341 msgid "" "To copy the manifest object, you include the ``multipart-manifest=get`` " "query parameter in the **COPY** request. The new object contains the same " "manifest as the original. The segment objects are not copied. Instead, both " "the original and new manifest objects share the same set of segment objects." msgstr "" #: ../../source/api/object-expiration.rst:3 msgid "Object expiration" msgstr "" #: ../../source/api/object-expiration.rst:5 msgid "" "You can schedule Object Storage (swift) objects to expire by setting the ``X-" "Delete-At`` or ``X-Delete-After`` header. Once the object is deleted, swift " "will no longer serve the object and it will be deleted from the cluster " "shortly thereafter." msgstr "" #: ../../source/api/object-expiration.rst:10 msgid "" "Set an object to expire at an absolute time (in Unix time). You can get the " "current Unix time by running ``date +'%s'``." msgstr "" #: ../../source/api/object-expiration.rst:17 msgid "Verify the ``X-Delete-At`` header has posted to the object:" msgstr "" #: ../../source/api/object-expiration.rst:23 msgid "Set an object to expire after a relative amount of time (in seconds):" msgstr "" #: ../../source/api/object-expiration.rst:29 msgid "" "The ``X-Delete-After`` header will be converted to ``X-Delete-At``. Verify " "the ``X-Delete-At`` header has posted to the object:" msgstr "" #: ../../source/api/object-expiration.rst:36 msgid "" "If you no longer want to expire the object, you can remove the ``X-Delete-" "At`` header:" msgstr "" #: ../../source/api/object-expiration.rst:45 msgid "" "In order for object expiration to work properly, the ``swift-object-" "expirer`` daemon will need access to all backend servers in the cluster. The " "daemon does not need access to the proxy-server or public network." msgstr "" #: ../../source/api/object_api_v1_overview.rst:2 msgid "Object Storage API overview" msgstr "" #: ../../source/api/object_api_v1_overview.rst:4 msgid "" "OpenStack Object Storage is a highly available, distributed, eventually " "consistent object/blob store. You create, modify, and get objects and " "metadata by using the Object Storage API, which is implemented as a set of " "Representational State Transfer (REST) web services." msgstr "" #: ../../source/api/object_api_v1_overview.rst:9 msgid "" "For an introduction to OpenStack Object Storage, see the :doc:`/admin/index`." msgstr "" #: ../../source/api/object_api_v1_overview.rst:11 msgid "" "You use the HTTPS (SSL) protocol to interact with Object Storage, and you " "use standard HTTP calls to perform API operations. You can also use language-" "specific APIs, which use the RESTful API, that make it easier for you to " "integrate into your applications." msgstr "" #: ../../source/api/object_api_v1_overview.rst:16 msgid "" "To assert your right to access and change data in an account, you identify " "yourself to Object Storage by using an authentication token. To get a token, " "you present your credentials to an authentication service. The " "authentication service returns a token and the URL for the account. " "Depending on which authentication service that you use, the URL for the " "account appears in:" msgstr "" #: ../../source/api/object_api_v1_overview.rst:23 msgid "" "**OpenStack Identity Service**. The URL is defined in the service catalog." msgstr "" #: ../../source/api/object_api_v1_overview.rst:26 msgid "" "**Tempauth**. The URL is provided in the ``X-Storage-Url`` response header." msgstr "" #: ../../source/api/object_api_v1_overview.rst:29 msgid "" "In both cases, the URL is the full URL and includes the account resource." msgstr "" #: ../../source/api/object_api_v1_overview.rst:32 msgid "" "The Object Storage API supports the standard, non-serialized response " "format, which is the default, and both JSON and XML serialized response " "formats." msgstr "" #: ../../source/api/object_api_v1_overview.rst:36 msgid "The Object Storage system organizes data in a hierarchy, as follows:" msgstr "" #: ../../source/api/object_api_v1_overview.rst:38 msgid "**Account**. Represents the top-level of the hierarchy." msgstr "" #: ../../source/api/object_api_v1_overview.rst:40 msgid "" "Your service provider creates your account and you own all resources in that " "account. The account defines a namespace for containers. A container might " "have the same name in two different accounts." msgstr "" #: ../../source/api/object_api_v1_overview.rst:44 msgid "" "In the OpenStack environment, *account* is synonymous with a project or " "tenant." msgstr "" #: ../../source/api/object_api_v1_overview.rst:47 msgid "" "**Container**. Defines a namespace for objects. An object with the same name " "in two different containers represents two different objects. You can create " "any number of containers within an account." msgstr "" #: ../../source/api/object_api_v1_overview.rst:51 msgid "" "In addition to containing objects, you can also use the container to control " "access to objects by using an access control list (ACL). You cannot store an " "ACL with individual objects." msgstr "" #: ../../source/api/object_api_v1_overview.rst:55 msgid "" "In addition, you configure and control many other features, such as object " "versioning, at the container level." msgstr "" #: ../../source/api/object_api_v1_overview.rst:58 msgid "You can bulk-delete up to 10,000 containers in a single request." msgstr "" #: ../../source/api/object_api_v1_overview.rst:60 msgid "" "You can set a storage policy on a container with predefined names and " "definitions from your cloud provider." msgstr "" #: ../../source/api/object_api_v1_overview.rst:63 msgid "" "**Object**. Stores data content, such as documents, images, and so on. You " "can also store custom metadata with an object." msgstr "" #: ../../source/api/object_api_v1_overview.rst:66 msgid "With the Object Storage API, you can:" msgstr "" #: ../../source/api/object_api_v1_overview.rst:68 msgid "" "Store an unlimited number of objects. Each object can be as large as 5 GB, " "which is the default. You can configure the maximum object size." msgstr "" #: ../../source/api/object_api_v1_overview.rst:72 msgid "Upload and store objects of any size with large object creation." msgstr "" #: ../../source/api/object_api_v1_overview.rst:74 msgid "Use cross-origin resource sharing to manage object security." msgstr "" #: ../../source/api/object_api_v1_overview.rst:76 msgid "Compress files using content-encoding metadata." msgstr "" #: ../../source/api/object_api_v1_overview.rst:78 msgid "" "Override browser behavior for an object using content-disposition metadata." msgstr "" #: ../../source/api/object_api_v1_overview.rst:80 msgid "Schedule objects for deletion." msgstr "" #: ../../source/api/object_api_v1_overview.rst:82 msgid "Bulk-delete up to 10,000 objects in a single request." msgstr "" #: ../../source/api/object_api_v1_overview.rst:84 msgid "Auto-extract archive files." msgstr "" #: ../../source/api/object_api_v1_overview.rst:86 msgid "Generate a URL that provides time-limited **GET** access to an object." msgstr "" #: ../../source/api/object_api_v1_overview.rst:89 msgid "" "Upload objects directly to the Object Storage system from a browser by using " "form **POST** middleware." msgstr "" #: ../../source/api/object_api_v1_overview.rst:92 msgid "Create symbolic links to other objects." msgstr "" #: ../../source/api/object_api_v1_overview.rst:94 msgid "" "The account, container, and object hierarchy affects the way you interact " "with the Object Storage API." msgstr "" #: ../../source/api/object_api_v1_overview.rst:97 msgid "" "Specifically, the resource path reflects this structure and has this format:" msgstr "" #: ../../source/api/object_api_v1_overview.rst:104 msgid "" "For example, for the ``flowers/rose.jpg`` object in the ``images`` container " "in the ``12345678912345`` account, the resource path is:" msgstr "" #: ../../source/api/object_api_v1_overview.rst:111 msgid "" "Notice that the object name contains the ``/`` character. This slash does " "not indicate that Object Storage has a sub-hierarchy called ``flowers`` " "because containers do not store objects in actual sub-folders. However, the " "inclusion of ``/`` or a similar convention inside object names enables you " "to create pseudo-hierarchical folders and directories." msgstr "" #: ../../source/api/object_api_v1_overview.rst:118 msgid "" "For example, if the endpoint for Object Storage is ``objects.mycloud.com``, " "the returned URL is ``https://objects.mycloud.com/v1/12345678912345``." msgstr "" #: ../../source/api/object_api_v1_overview.rst:122 msgid "To access a container, append the container name to the resource path." msgstr "" #: ../../source/api/object_api_v1_overview.rst:124 msgid "" "To access an object, append the container and the object name to the path." msgstr "" #: ../../source/api/object_api_v1_overview.rst:127 msgid "" "If you have a large number of containers or objects, you can use query " "parameters to page through large lists of containers or objects. Use the " "``marker``, ``limit``, and ``end_marker`` query parameters to control how " "many items are returned in a list and where the list starts or ends. If you " "want to page through in reverse order, you can use the query parameter " "``reverse``, noting that your marker and end_markers should be switched when " "applied to a reverse listing. I.e, for a list of objects ``[a, b, c, d, e]`` " "the non-reversed could be:" msgstr "" #: ../../source/api/object_api_v1_overview.rst:142 msgid "" "However, when reversed marker and end_marker are applied to a reversed list:" msgstr "" #: ../../source/api/object_api_v1_overview.rst:150 msgid "" "Object Storage HTTP requests have the following default constraints. Your " "service provider might use different default values." msgstr "" #: ../../source/api/object_api_v1_overview.rst:154 msgid "Item" msgstr "" #: ../../source/api/object_api_v1_overview.rst:154 msgid "Maximum value" msgstr "" #: ../../source/api/object_api_v1_overview.rst:154 msgid "Notes" msgstr "" #: ../../source/api/object_api_v1_overview.rst:156 msgid "90" msgstr "" #: ../../source/api/object_api_v1_overview.rst:156 msgid "Number of HTTP headers" msgstr "" #: ../../source/api/object_api_v1_overview.rst:157 msgid "4096 bytes" msgstr "" #: ../../source/api/object_api_v1_overview.rst:157 msgid "Length of HTTP headers" msgstr "" #: ../../source/api/object_api_v1_overview.rst:158 msgid "8192 bytes" msgstr "" #: ../../source/api/object_api_v1_overview.rst:158 msgid "Length per HTTP request line" msgstr "" #: ../../source/api/object_api_v1_overview.rst:159 msgid "5 GB" msgstr "" #: ../../source/api/object_api_v1_overview.rst:159 msgid "Length of HTTP request" msgstr "" #: ../../source/api/object_api_v1_overview.rst:160 msgid "256 bytes" msgstr "" #: ../../source/api/object_api_v1_overview.rst:160 msgid "Cannot contain the ``/`` character." msgstr "" #: ../../source/api/object_api_v1_overview.rst:160 msgid "Length of container names" msgstr "" #: ../../source/api/object_api_v1_overview.rst:161 msgid "1024 bytes" msgstr "" #: ../../source/api/object_api_v1_overview.rst:161 msgid "By default, there are no character restrictions." msgstr "" #: ../../source/api/object_api_v1_overview.rst:161 msgid "Length of object names" msgstr "" #: ../../source/api/object_api_v1_overview.rst:164 msgid "" "You must UTF-8-encode and then URL-encode container and object names before " "you call the API binding. If you use an API binding that performs the URL-" "encoding for you, do not URL-encode the names before you call the API " "binding. Otherwise, you double-encode these names. Check the length " "restrictions against the URL-encoded string." msgstr "" #: ../../source/api/object_api_v1_overview.rst:170 msgid "" "The API Reference describes the operations that you can perform with the " "Object Storage API:" msgstr "" #: ../../source/api/object_api_v1_overview.rst:173 msgid "" "`Storage accounts `__: Use to perform account-level tasks." msgstr "" #: ../../source/api/object_api_v1_overview.rst:177 msgid "" "Lists containers for a specified account. Creates, updates, and deletes " "account metadata. Shows account metadata." msgstr "" #: ../../source/api/object_api_v1_overview.rst:180 msgid "" "`Storage containers `__: Use to perform container-level tasks." msgstr "" #: ../../source/api/object_api_v1_overview.rst:184 msgid "" "Lists objects in a specified container. Creates, shows details for, and " "deletes containers. Creates, updates, shows, and deletes container metadata." msgstr "" #: ../../source/api/object_api_v1_overview.rst:188 msgid "" "`Storage objects `__: Use to perform object-level tasks." msgstr "" #: ../../source/api/object_api_v1_overview.rst:192 msgid "" "Creates, replaces, shows details for, and deletes objects. Copies objects " "with another object with a new or different name. Updates object metadata." msgstr "" #: ../../source/api/object_versioning.rst:3 msgid "Object versioning" msgstr "" #: ../../source/api/object_versioning.rst:5 msgid "" "You can store multiple versions of your content so that you can recover from " "unintended overwrites. Object versioning is an easy way to implement version " "control, which you can use with any type of content." msgstr "" #: ../../source/api/object_versioning.rst:10 msgid "" "You cannot version a large-object manifest file, but the large-object " "manifest file can point to versioned segments." msgstr "" #: ../../source/api/object_versioning.rst:14 msgid "" "It is strongly recommended that you put non-current objects in a different " "container than the container where current object versions reside." msgstr "" #: ../../source/api/object_versioning.rst:18 msgid "" "To allow object versioning within a cluster, the cloud provider should add " "the ``versioned_writes`` filter to the pipeline and set the " "``allow_versioned_writes`` option to ``true`` in the ``[filter:" "versioned_writes]`` section of the proxy-server configuration file." msgstr "" #: ../../source/api/object_versioning.rst:23 msgid "" "To enable object versioning for a container, you must specify an \"archive " "container\" that will retain non-current versions via either the ``X-" "Versions-Location`` or ``X-History-Location`` header. These two headers " "enable two distinct modes of operation. Either mode may be used within a " "cluster, but only one mode may be active for any given container. You must " "UTF-8-encode and then URL-encode the container name before you include it in " "the header." msgstr "" #: ../../source/api/object_versioning.rst:31 msgid "" "For both modes, **PUT** requests will archive any pre-existing objects " "before writing new data, and **GET** requests will serve the current " "version. **COPY** requests behave like a **GET** followed by a **PUT**; that " "is, if the copy *source* is in a versioned container then the current " "version will be copied, and if the copy *destination* is in a versioned " "container then any pre-existing object will be archived before writing new " "data." msgstr "" #: ../../source/api/object_versioning.rst:38 msgid "" "If object versioning was enabled using ``X-History-Location``, then object " "**DELETE** requests will copy the current version to the archive container " "then remove it from the versioned container." msgstr "" #: ../../source/api/object_versioning.rst:42 msgid "" "If object versioning was enabled using ``X-Versions-Location``, then object " "**DELETE** requests will restore the most-recent version from the archive " "container, overwriting the current version." msgstr "" #: ../../source/api/object_versioning.rst:47 msgid "Example Using ``X-Versions-Location``" msgstr "" #: ../../source/api/object_versioning.rst:49 #: ../../source/api/object_versioning.rst:188 msgid "Create the ``current`` container:" msgstr "" #: ../../source/api/object_versioning.rst:64 #: ../../source/api/object_versioning.rst:203 msgid "Create the first version of an object in the ``current`` container:" msgstr "" #: ../../source/api/object_versioning.rst:81 #: ../../source/api/object_versioning.rst:220 msgid "" "Nothing is written to the non-current version container when you initially " "**PUT** an object in the ``current`` container. However, subsequent **PUT** " "requests that edit an object trigger the creation of a version of that " "object in the ``archive`` container." msgstr "" #: ../../source/api/object_versioning.rst:86 #: ../../source/api/object_versioning.rst:225 msgid "These non-current versions are named as follows:" msgstr "" #: ../../source/api/object_versioning.rst:92 #: ../../source/api/object_versioning.rst:231 msgid "" "Where ``length`` is the 3-character, zero-padded hexadecimal character " "length of the object, ```` is the object name, and " "```` is the time when the object was initially created as a " "current version." msgstr "" #: ../../source/api/object_versioning.rst:97 #: ../../source/api/object_versioning.rst:236 msgid "Create a second version of the object in the ``current`` container:" msgstr "" #: ../../source/api/object_versioning.rst:114 #: ../../source/api/object_versioning.rst:253 msgid "" "Issue a **GET** request to a versioned object to get the current version of " "the object. You do not have to do any request redirects or metadata lookups." msgstr "" #: ../../source/api/object_versioning.rst:118 #: ../../source/api/object_versioning.rst:257 #: ../../source/api/object_versioning.rst:301 msgid "List older versions of the object in the ``archive`` container:" msgstr "" #: ../../source/api/object_versioning.rst:140 #: ../../source/api/object_versioning.rst:279 msgid "" "A **POST** request to a versioned object updates only the metadata for the " "object and does not create a new version of the object. New versions are " "created only when the content of the object changes." msgstr "" #: ../../source/api/object_versioning.rst:144 msgid "" "Issue a **DELETE** request to a versioned object to remove the current " "version of the object and replace it with the next-most current version in " "the non-current container." msgstr "" #: ../../source/api/object_versioning.rst:161 msgid "" "List objects in the ``archive`` container to show that the archived object " "was moved back to the ``current`` container:" msgstr "" #: ../../source/api/object_versioning.rst:181 msgid "" "This next-most current version carries with it any metadata last set on it. " "If want to completely remove an object and you have five versions of it, you " "must **DELETE** it five times." msgstr "" #: ../../source/api/object_versioning.rst:186 msgid "Example Using ``X-History-Location``" msgstr "" #: ../../source/api/object_versioning.rst:283 msgid "" "Issue a **DELETE** request to a versioned object to copy the current version " "of the object to the archive container then delete it from the current " "container. Subsequent **GET** requests to the object in the current " "container will return ``404 Not Found``." msgstr "" #: ../../source/api/object_versioning.rst:324 msgid "" "In addition to the two previous versions of the object, the archive " "container has a \"delete marker\" to record when the object was deleted." msgstr "" #: ../../source/api/object_versioning.rst:327 msgid "" "To permanently delete a previous version, issue a **DELETE** to the version " "in the archive container." msgstr "" #: ../../source/api/object_versioning.rst:331 msgid "Disabling Object Versioning" msgstr "" #: ../../source/api/object_versioning.rst:333 msgid "" "To disable object versioning for the ``current`` container, remove its ``X-" "Versions-Location`` metadata header by sending an empty key value." msgstr "" #: ../../source/api/pagination.rst:3 msgid "Page through large lists of containers or objects" msgstr "" #: ../../source/api/pagination.rst:5 msgid "" "If you have a large number of containers or objects, you can use the " "``marker``, ``limit``, and ``end_marker`` parameters to control how many " "items are returned in a list and where the list starts or ends. If you want " "to page backwards you can use the ``reverse`` parameter." msgstr "" #: ../../source/api/pagination.rst:11 msgid "" "When you request a list of containers or objects, Object Storage returns a " "maximum of 10,000 names for each request. To get subsequent names, you must " "make another request with the ``marker`` parameter. Set the ``marker`` " "parameter to the name of the last item returned in the previous list. You " "must URL-encode the ``marker`` value before you send the HTTP request. " "Object Storage returns a maximum of 10,000 names starting after the last " "item returned." msgstr "" #: ../../source/api/pagination.rst:18 msgid "marker" msgstr "" #: ../../source/api/pagination.rst:21 msgid "" "To return fewer than 10,000 names, use the ``limit`` parameter. If the " "number of names returned equals the specified ``limit`` (or 10,000 if you " "omit the ``limit`` parameter), you can assume there are more names to list. " "If the number of names in the list is exactly divisible by the ``limit`` " "value, the last request has no content." msgstr "" #: ../../source/api/pagination.rst:26 msgid "limit" msgstr "" #: ../../source/api/pagination.rst:29 msgid "" "Limits the result set to names that are less than the ``end_marker`` " "parameter value. You must URL-encode the ``end_marker`` value before you " "send the HTTP request." msgstr "" #: ../../source/api/pagination.rst:31 msgid "end_marker" msgstr "" #: ../../source/api/pagination.rst:34 msgid "" "By default, listings are returned sorted by name, ascending. If you include " "the ``reverse=true`` query parameter, the listing will be returned sorted by " "name, descending." msgstr "" #: ../../source/api/pagination.rst:36 msgid "reverse" msgstr "" #: ../../source/api/pagination.rst:39 msgid "To page through a large list of containers" msgstr "" #: ../../source/api/pagination.rst:41 msgid "Assume the following list of container names:" msgstr "" #: ../../source/api/pagination.rst:51 msgid "Use a ``limit`` of two:" msgstr "" #: ../../source/api/pagination.rst:62 msgid "Because two container names are returned, there are more names to list." msgstr "" #: ../../source/api/pagination.rst:65 msgid "" "Make another request with a ``marker`` parameter set to the name of the last " "item returned:" msgstr "" #: ../../source/api/pagination.rst:78 msgid "Again, two items are returned, and there might be more." msgstr "" #: ../../source/api/pagination.rst:80 msgid "Make another request with a ``marker`` of the last item returned:" msgstr "" #: ../../source/api/pagination.rst:91 msgid "" "You receive a one-item response, which is fewer than the ``limit`` number of " "names. This indicates that this is the end of the list." msgstr "" #: ../../source/api/pagination.rst:94 msgid "" "Use the ``end_marker`` parameter to limit the result set to object names " "that are less than the ``end_marker`` parameter value:" msgstr "" #: ../../source/api/pagination.rst:108 msgid "" "You receive a result set of all container names before the ``end-marker`` " "value." msgstr "" #: ../../source/api/pagination.rst:111 msgid "Use the ``reverse`` parameter to work from the back of the list:" msgstr "" #: ../../source/api/pagination.rst:127 msgid "You can also combine parameters:" msgstr "" #: ../../source/api/pseudo-hierarchical-folders-directories.rst:3 msgid "Pseudo-hierarchical folders and directories" msgstr "" #: ../../source/api/pseudo-hierarchical-folders-directories.rst:5 msgid "" "Although you cannot nest directories in OpenStack Object Storage, you can " "simulate a hierarchical structure within a single container by adding " "forward slash characters (``/``) in the object name. To navigate the pseudo-" "directory structure, you can use the ``delimiter`` query parameter. This " "example shows you how to use pseudo-hierarchical folders and directories." msgstr "" #: ../../source/api/pseudo-hierarchical-folders-directories.rst:14 msgid "" "In this example, the objects reside in a container called ``backups``. " "Within that container, the objects are organized in a pseudo-directory " "called ``photos``. The container name is not displayed in the example, but " "it is a part of the object URLs. For instance, the URL of the picture ``me." "jpg`` is ``https://swift.example.com/v1/CF_xer7_343/backups/photos/me.jpg``." msgstr "" #: ../../source/api/pseudo-hierarchical-folders-directories.rst:22 msgid "List pseudo-hierarchical folders request: HTTP" msgstr "" #: ../../source/api/pseudo-hierarchical-folders-directories.rst:24 msgid "" "To display a list of all the objects in the storage container, use ``GET`` " "without a ``delimiter`` or ``prefix``." msgstr "" #: ../../source/api/pseudo-hierarchical-folders-directories.rst:32 msgid "" "The system returns status code 2xx (between 200 and 299, inclusive) and the " "requested list of the objects." msgstr "" #: ../../source/api/pseudo-hierarchical-folders-directories.rst:46 msgid "" "Use the delimiter parameter to limit the displayed results. To use " "``delimiter`` with pseudo-directories, you must use the parameter slash (``/" "``)." msgstr "" #: ../../source/api/pseudo-hierarchical-folders-directories.rst:55 msgid "" "The system returns status code 2xx (between 200 and 299, inclusive) and the " "requested matching objects. Because you use the slash, only the pseudo-" "directory ``photos/`` displays. The returned values from a slash " "``delimiter`` query are not real objects. The value will refer to a real " "object if it does not end with a slash. The pseudo-directories have no " "content-type, rather, each pseudo-directory has its own ``subdir`` entry in " "the response of JSON and XML results. For example:" msgstr "" #: ../../source/api/pseudo-hierarchical-folders-directories.rst:81 msgid "" "Use the ``prefix`` and ``delimiter`` parameters to view the objects inside a " "pseudo-directory, including further nested pseudo-directories." msgstr "" #: ../../source/api/pseudo-hierarchical-folders-directories.rst:89 msgid "" "The system returns status code 2xx (between 200 and 299, inclusive) and the " "objects and pseudo-directories within the top level pseudo-directory." msgstr "" #: ../../source/api/pseudo-hierarchical-folders-directories.rst:136 msgid "" "You can create an unlimited number of nested pseudo-directories. To navigate " "through them, use a longer ``prefix`` parameter coupled with the " "``delimiter`` parameter. In this sample output, there is a pseudo-directory " "called ``dogs`` within the pseudo-directory ``animals``. To navigate " "directly to the files contained within ``dogs``, enter the following command:" msgstr "" #: ../../source/api/pseudo-hierarchical-folders-directories.rst:148 msgid "" "The system returns status code 2xx (between 200 and 299, inclusive) and the " "objects and pseudo-directories within the nested pseudo-directory." msgstr "" #: ../../source/api/serialized-response-formats.rst:3 msgid "Serialized response formats" msgstr "" #: ../../source/api/serialized-response-formats.rst:5 msgid "" "By default, the Object Storage API uses a ``text/plain`` response format. In " "addition, both JSON and XML data serialization response formats are " "supported." msgstr "" #: ../../source/api/serialized-response-formats.rst:9 msgid "To define the response format, use one of these methods:" msgstr "" #: ../../source/api/serialized-response-formats.rst:12 msgid "Description" msgstr "" #: ../../source/api/serialized-response-formats.rst:12 msgid "Method" msgstr "" #: ../../source/api/serialized-response-formats.rst:14 msgid "" "Append this parameter to the URL for a ``GET`` request, where ``format`` is " "``json`` or ``xml``." msgstr "" #: ../../source/api/serialized-response-formats.rst:14 msgid "format= ``format`` query parameter" msgstr "" #: ../../source/api/serialized-response-formats.rst:17 msgid "" "Include this header in the ``GET`` request. The valid header values are:" msgstr "" #: ../../source/api/serialized-response-formats.rst:17 msgid "``Accept`` request header" msgstr "" #: ../../source/api/serialized-response-formats.rst:20 msgid "text/plain" msgstr "" #: ../../source/api/serialized-response-formats.rst:21 msgid "Plain text response format. The default." msgstr "" #: ../../source/api/serialized-response-formats.rst:22 msgid "application/jsontext" msgstr "" #: ../../source/api/serialized-response-formats.rst:23 msgid "JSON data serialization response format." msgstr "" #: ../../source/api/serialized-response-formats.rst:24 msgid "application/xml" msgstr "" #: ../../source/api/serialized-response-formats.rst:25 #: ../../source/api/serialized-response-formats.rst:27 msgid "XML data serialization response format." msgstr "" #: ../../source/api/serialized-response-formats.rst:26 msgid "text/xml" msgstr "" #: ../../source/api/serialized-response-formats.rst:31 msgid "Example 1. JSON example with format query parameter" msgstr "" #: ../../source/api/serialized-response-formats.rst:33 msgid "" "For example, this request uses the ``format`` query parameter to ask for a " "JSON response:" msgstr "" #: ../../source/api/serialized-response-formats.rst:54 msgid "" "Object Storage lists container names with additional information in JSON " "format:" msgstr "" #: ../../source/api/serialized-response-formats.rst:74 msgid "Example 2. XML example with Accept header" msgstr "" #: ../../source/api/serialized-response-formats.rst:76 msgid "" "This request uses the ``Accept`` request header to ask for an XML response:" msgstr "" #: ../../source/api/serialized-response-formats.rst:98 msgid "" "Object Storage lists container names with additional information in XML " "format:" msgstr "" #: ../../source/api/serialized-response-formats.rst:117 msgid "" "The remainder of the examples in this guide use standard, non-serialized " "responses. However, all ``GET`` requests that perform list operations accept " "the ``format`` query parameter or ``Accept`` request header." msgstr "" #: ../../source/api/static-website.rst:5 msgid "Create static website" msgstr "" #: ../../source/api/static-website.rst:11 msgid "" "You can use your Object Storage account to create a static website. This " "static website is created with Static Web middleware and serves container " "data with a specified index file, error file resolution, and optional file " "listings. This mode is normally active only for anonymous requests, which " "provide no authentication token. To use it with authenticated requests, set " "the header ``X-Web-Mode`` to ``TRUE`` on the request." msgstr "" #: ../../source/api/static-website.rst:18 msgid "" "The Static Web filter must be added to the pipeline in your ``/etc/swift/" "proxy-server.conf`` file below any authentication middleware. You must also " "add a Static Web middleware configuration section." msgstr "" #: ../../source/api/static-website.rst:23 msgid "" "Your publicly readable containers are checked for two headers, ``X-Container-" "Meta-Web-Index`` and ``X-Container-Meta-Web-Error``. The ``X-Container-Meta-" "Web-Error`` header is discussed below, in the section called :ref:" "`set_error_static_website`." msgstr "" #: ../../source/api/static-website.rst:28 msgid "" "Use ``X-Container-Meta-Web-Index`` to determine the index file (or default " "page served, such as ``index.html``) for your website. When someone " "initially enters your site, the ``index.html`` file displays automatically. " "If you create sub-directories for your site by creating pseudo-directories " "in your container, the index page for each sub-directory is displayed by " "default. If your pseudo-directory does not have a file with the same name as " "your index file, visits to the sub-directory return a 404 error." msgstr "" #: ../../source/api/static-website.rst:37 msgid "" "You also have the option of displaying a list of files in your pseudo-" "directory instead of a web page. To do this, set the ``X-Container-Meta-Web-" "Listings`` header to ``TRUE``. You may add styles to your file listing by " "setting ``X-Container-Meta-Web-Listings-CSS`` to a style sheet (for example, " "``lists.css``)." msgstr "" #: ../../source/api/static-website.rst:44 msgid "Static Web middleware through Object Storage" msgstr "" #: ../../source/api/static-website.rst:46 msgid "" "The following sections show how to use Static Web middleware through Object " "Storage." msgstr "" #: ../../source/api/static-website.rst:50 msgid "Make container publicly readable" msgstr "" #: ../../source/api/static-website.rst:52 msgid "" "Make the container publicly readable. Once the container is publicly " "readable, you can access your objects directly, but you must set the index " "file to browse the main site URL and its sub-directories." msgstr "" #: ../../source/api/static-website.rst:62 msgid "Set site index file" msgstr "" #: ../../source/api/static-website.rst:64 msgid "" "Set the index file. In this case, ``index.html`` is the default file " "displayed when the site appears." msgstr "" #: ../../source/api/static-website.rst:72 msgid "Enable file listing" msgstr "" #: ../../source/api/static-website.rst:74 msgid "" "Turn on file listing. If you do not set the index file, the URL displays a " "list of the objects in the container. Instructions on styling the list with " "a CSS follow." msgstr "" #: ../../source/api/static-website.rst:83 msgid "Enable CSS for file listing" msgstr "" #: ../../source/api/static-website.rst:85 msgid "Style the file listing using a CSS." msgstr "" #: ../../source/api/static-website.rst:94 msgid "Set error pages for static website" msgstr "" #: ../../source/api/static-website.rst:96 msgid "" "You can create and set custom error pages for visitors to your website; " "currently, only 401 (Unauthorized) and 404 (Not Found) errors are supported. " "To do this, set the metadata header, ``X-Container-Meta-Web-Error``." msgstr "" #: ../../source/api/static-website.rst:101 msgid "" "Error pages are served with the status code pre-pended to the name of the " "error page you set. For instance, if you set ``X-Container-Meta-Web-Error`` " "to ``error.html``, 401 errors will display the page ``401error.html``. " "Similarly, 404 errors will display ``404error.html``. You must have both of " "these pages created in your container when you set the ``X-Container-Meta-" "Web-Error`` metadata, or your site will display generic error pages." msgstr "" #: ../../source/api/static-website.rst:109 msgid "" "You only have to set the ``X-Container-Meta-Web-Error`` metadata once for " "your entire static website." msgstr "" #: ../../source/api/static-website.rst:113 msgid "Set error pages for static website request" msgstr "" #: ../../source/api/static-website.rst:120 msgid "Any 2\\ ``nn`` response indicates success." msgstr "" #: ../../source/api/temporary_url_middleware.rst:3 msgid "Temporary URL middleware" msgstr "" #: ../../source/api/temporary_url_middleware.rst:5 msgid "" "To discover whether your Object Storage system supports this feature, check " "with your service provider or send a **GET** request using the ``/info`` " "path." msgstr "" #: ../../source/api/temporary_url_middleware.rst:9 msgid "" "A temporary URL gives users temporary access to objects. For example, a " "website might want to provide a link to download a large object in Object " "Storage, but the Object Storage account has no public access. The website " "can generate a URL that provides time-limited **GET** access to the object. " "When the web browser user clicks on the link, the browser downloads the " "object directly from Object Storage, eliminating the need for the website to " "act as a proxy for the request." msgstr "" #: ../../source/api/temporary_url_middleware.rst:17 msgid "" "Furthermore, a temporary URL can be prefix-based. These URLs contain a " "signature which is valid for all objects which share a common prefix. They " "are useful for sharing a set of objects." msgstr "" #: ../../source/api/temporary_url_middleware.rst:21 msgid "" "Ask your cloud administrator to enable the temporary URL feature. For " "information, see :ref:`tempurl` in the *Source Documentation*." msgstr "" #: ../../source/api/temporary_url_middleware.rst:26 msgid "" "To use **POST** requests to upload objects to specific Object Storage " "locations, use :doc:`form_post_middleware` instead of temporary URL " "middleware." msgstr "" #: ../../source/api/temporary_url_middleware.rst:30 msgid "Temporary URL format" msgstr "" #: ../../source/api/temporary_url_middleware.rst:32 msgid "" "A temporary URL is comprised of the URL for an object with added query " "parameters:" msgstr "" #: ../../source/api/temporary_url_middleware.rst:35 msgid "**Example Temporary URL format**" msgstr "" #: ../../source/api/temporary_url_middleware.rst:44 msgid "The example shows these elements:" msgstr "" #: ../../source/api/temporary_url_middleware.rst:47 msgid "**Object URL**: Required. The full path URL to the object." msgstr "" #: ../../source/api/temporary_url_middleware.rst:49 msgid "" "**temp\\_url\\_sig**: Required. An HMAC cryptographic signature that defines " "the allowed HTTP method, expiration date, full path to the object, and the " "secret key for the temporary URL. The digest used (for example, SHA-256 or " "SHA-512) must be supported by the cluster; supported digests will be listed " "in the ``tempurl.allowed_digests`` key in the cluster's capabilities." msgstr "" #: ../../source/api/temporary_url_middleware.rst:55 msgid "" "**temp\\_url\\_expires**: Required. An expiration date as a UNIX Epoch " "timestamp or ISO 8601 UTC timestamp. For example, ``1390852007`` or " "``2014-01-27T19:46:47Z`` can be used to represent ``Mon, 27 Jan 2014 " "19:46:47 GMT``." msgstr "" #: ../../source/api/temporary_url_middleware.rst:60 msgid "" "For more information, see `Epoch & Unix Timestamp Conversion Tools `__." msgstr "" #: ../../source/api/temporary_url_middleware.rst:63 msgid "" "**filename**: Optional. Overrides the default file name. Object Storage " "generates a default file name for **GET** temporary URLs that is based on " "the object name. Object Storage returns this value in the ``Content-" "Disposition`` response header. Browsers can interpret this file name value " "as a file attachment to be saved." msgstr "" #: ../../source/api/temporary_url_middleware.rst:69 msgid "" "A prefix-based temporary URL is similar but requires the parameter " "``temp_url_prefix``, which must be equal to the common prefix shared by all " "object names for which the URL is valid." msgstr "" #: ../../source/api/temporary_url_middleware.rst:83 msgid "Secret Keys" msgstr "" #: ../../source/api/temporary_url_middleware.rst:85 msgid "" "The cryptographic signature used in Temporary URLs and also in :doc:" "`form_post_middleware` uses a secret key. Object Storage allows you to store " "two secret key values per account, and two per container. When validating a " "request, Object Storage checks signatures against all keys. Using two keys " "at each level enables key rotation without invalidating existing temporary " "URLs." msgstr "" #: ../../source/api/temporary_url_middleware.rst:91 msgid "" "To set the keys at the account level, set one or both of the following " "request headers to arbitrary values on a **POST** request to the account:" msgstr "" #: ../../source/api/temporary_url_middleware.rst:94 msgid "``X-Account-Meta-Temp-URL-Key``" msgstr "" #: ../../source/api/temporary_url_middleware.rst:96 msgid "``X-Account-Meta-Temp-URL-Key-2``" msgstr "" #: ../../source/api/temporary_url_middleware.rst:98 msgid "" "To set the keys at the container level, set one or both of the following " "request headers to arbitrary values on a **POST** or **PUT** request to the " "container:" msgstr "" #: ../../source/api/temporary_url_middleware.rst:102 msgid "``X-Container-Meta-Temp-URL-Key``" msgstr "" #: ../../source/api/temporary_url_middleware.rst:104 msgid "``X-Container-Meta-Temp-URL-Key-2``" msgstr "" #: ../../source/api/temporary_url_middleware.rst:106 msgid "The arbitrary values serve as the secret keys." msgstr "" #: ../../source/api/temporary_url_middleware.rst:108 msgid "" "For example, use the **swift post** command to set the secret key to " "*``MYKEY``*:" msgstr "" #: ../../source/api/temporary_url_middleware.rst:117 msgid "" "Changing these headers invalidates any previously generated temporary URLs " "within 60 seconds, which is the memcache time for the key." msgstr "" #: ../../source/api/temporary_url_middleware.rst:121 msgid "HMAC signature for temporary URLs" msgstr "" #: ../../source/api/temporary_url_middleware.rst:123 msgid "" "Temporary URL middleware uses an HMAC cryptographic signature. This " "signature includes these elements:" msgstr "" #: ../../source/api/temporary_url_middleware.rst:126 msgid "The allowed method. Typically, **GET** or **PUT**." msgstr "" #: ../../source/api/temporary_url_middleware.rst:128 msgid "" "Expiry time. In the example for the HMAC-SHA256 signature for temporary URLs " "below, the expiry time is set to ``86400`` seconds (or 1 day) into the " "future. Please be aware that you have to use a UNIX timestamp for generating " "the signature (in the API request it is also allowed to use an ISO 8601 UTC " "timestamp)." msgstr "" #: ../../source/api/temporary_url_middleware.rst:134 msgid "" "The path. Starting with ``/v1/`` onwards and including a container name and " "object. The path for prefix-based signatures must start with ``prefix:/v1/" "``. Do not URL-encode the path at this stage." msgstr "" #: ../../source/api/temporary_url_middleware.rst:138 msgid "" "The secret key. Use one of the key values as described in :ref:`secret_keys`." msgstr "" #: ../../source/api/temporary_url_middleware.rst:141 msgid "" "These sample Python codes show how to compute a signature for use with " "temporary URLs:" msgstr "" #: ../../source/api/temporary_url_middleware.rst:144 msgid "**Example HMAC-SHA256 signature for object-based temporary URLs**" msgstr "" #: ../../source/api/temporary_url_middleware.rst:159 msgid "**Example HMAC-SHA512 signature for prefix-based temporary URLs**" msgstr "" #: ../../source/api/temporary_url_middleware.rst:174 msgid "" "Do not URL-encode the path when you generate the HMAC signature. However, " "when you make the actual HTTP request, you should properly URL-encode the " "URL." msgstr "" #: ../../source/api/temporary_url_middleware.rst:178 msgid "" "The *``MYKEY``* value is one of the key values as described in :ref:" "`secret_keys`." msgstr "" #: ../../source/api/temporary_url_middleware.rst:184 msgid "" "If you want to transform a UNIX timestamp into an ISO 8601 UTC timestamp, " "you can use following code snippet:" msgstr "" #: ../../source/api/temporary_url_middleware.rst:193 msgid "Using the ``swift`` tool to generate a Temporary URL" msgstr "" #: ../../source/api/temporary_url_middleware.rst:195 msgid "" "The ``swift`` tool provides the tempurl_ option that auto-generates the " "*``temp_url_sig``* and *``temp_url_expires``* query parameters. For example, " "you might run this command:" msgstr "" #: ../../source/api/temporary_url_middleware.rst:205 msgid "" "The ``swift`` tool is not yet updated and continues to use the deprecated " "cipher SHA1." msgstr "" #: ../../source/api/temporary_url_middleware.rst:208 msgid "This command returns the path:" msgstr "" #: ../../source/api/temporary_url_middleware.rst:216 msgid "" "To create the temporary URL, prefix this path with the Object Storage " "storage host name. For example, prefix the path with ``https://swift-cluster." "example.com``, as follows:" msgstr "" #: ../../source/api/temporary_url_middleware.rst:226 msgid "" "Note that if the above example is copied exactly, and used in a command " "shell, then the ampersand is interpreted as an operator and the URL will be " "truncated. Enclose the URL in quotation marks to avoid this." msgstr "" #: ../../source/api/use_content-encoding_metadata.rst:3 msgid "Use Content-Encoding metadata" msgstr "" #: ../../source/api/use_content-encoding_metadata.rst:5 msgid "" "When you create an object or update its metadata, you can optionally set the " "``Content-Encoding`` metadata. This metadata enables you to indicate that " "the object content is compressed without losing the identity of the " "underlying media type (``Content-Type``) of the file, such as a video." msgstr "" #: ../../source/api/use_content-encoding_metadata.rst:10 msgid "**Example Content-Encoding header request: HTTP**" msgstr "" #: ../../source/api/use_content-encoding_metadata.rst:12 msgid "" "This example assigns an attachment type to the ``Content-Encoding`` header " "that indicates how the file is downloaded:" msgstr "" #: ../../source/api/use_the_content-disposition_metadata.rst:3 msgid "Use the Content-Disposition metadata" msgstr "" #: ../../source/api/use_the_content-disposition_metadata.rst:5 msgid "" "To override the default behavior for a browser, use the ``Content-" "Disposition`` header to specify the override behavior and assign this header " "to an object. For example, this header might specify that the browser use a " "download program to save this file rather than show the file, which is the " "default." msgstr "" #: ../../source/api/use_the_content-disposition_metadata.rst:11 msgid "**Example Override browser default behavior request: HTTP**" msgstr "" #: ../../source/api/use_the_content-disposition_metadata.rst:13 msgid "" "This example assigns an attachment type to the ``Content-Disposition`` " "header. This attachment type indicates that the file is to be downloaded as " "``goodbye.txt``:" msgstr ""