

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用預先簽章的 URL 上傳物件
<a name="PresignedUrlUploadObject"></a>



您可以使用預先簽章的 URL，允許某人將物件上傳到您的 Amazon S3 儲存貯體。使用預先簽章的 URL 將允許上傳，而不需要其他方擁有 AWS 安全登入資料或許可。預先簽章的 URL 受到建立它的使用者許可所限制。也就是說，如果您收到上傳物件的預先簽章 URL，則只有該 URL 建立者具有上傳該物件的必要許可時，您才能上傳物件。

當有人使用 URL 上傳物件時，Amazon S3 會於指定儲存貯體建立物件。如果儲存貯體中已具備您在預先簽章 URL 中指定之相同金鑰的物件，則 Amazon S3 會使用上傳的物件來取代現有的物件。上傳後，儲存貯體擁有者將擁有該物件。

如需預先簽章的 URL 一般資訊，請參閱 [使用預先簽章的 URL 來下載和上傳物件](using-presigned-url.md)。

您可使用 AWS Explorer for Visual Studio 建立上傳物件的預先簽章 URL，而無須撰寫任何程式碼。您可以使用 AWS SDK，透過編寫程式的方式產生預先簽章的 URL。

**注意**  
目前 AWS Toolkit for Visual Studio 不支援 Visual Studio for Mac。

## 使用 AWS Toolkit for Visual Studio (Windows)
<a name="upload-object-presignedurl-vsexplorer"></a>

1.  AWS Toolkit for Visual Studio 使用 *AWS Toolkit for Visual Studio 使用者指南*中的下列指示[安裝和設定 Toolkit for Visual Studio](https://docs.aws.amazon.com/toolkit-for-visual-studio/latest/user-guide/setup.html)。

1.  AWS 使用 *AWS Toolkit for Visual Studio 使用者指南*中的下列步驟，[連線至 以連線至 AWS](https://docs.aws.amazon.com/AWSToolkitVS/latest/UserGuide/connect.html) 。

1. 在標示為 **AWS Explorer** 的左側面板中，以滑鼠右鍵按一下在您想要上傳物件的目的地儲存貯體。

1. 選擇**建立預先簽章的 URL...**。

1. 在快顯視窗中，設定您預先簽章 URL 的到期日期和時間。

1. 針對**物件金鑰**，設定要上傳的檔案名稱。您上傳的檔案必須完全符合此名稱。如果儲存貯體中已存在具有相同物件金鑰的物件，則 Amazon S3 會使用新上傳的物件來取代現有物件。

1. 選擇 **PUT** 以指定將使用此預先簽章的 URL 來上傳物件。

1. 選擇**產生**按鈕。

1. 若要複製剪貼簿連結，請選擇**複製**。

1. 若要使用此 URL，您可以傳送包含 `curl` 命令的 PUT 請求。包含您檔案的完整路徑和預先簽章的 URL 本身。

   ```
   curl -X PUT -T "/path/to/file" "presigned URL"
   ```

## 使用 AWS SDKs 產生`PUT`預先簽章的 URL 以上傳檔案
<a name="presigned-urls-upload-sdk"></a>

 您可以產生可於限定時間內執行 S3 動作的預先簽署的 URL。

**注意**  
如果您使用 AWS CLI 或 AWS SDKs，預先簽章 URLs的過期時間最多可設定為 7 天。如需詳細資訊，請參閱[預先簽章 URL 的到期時間](https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-presigned-url.html#PresignedUrl-Expiration)。

------
#### [ Python ]

 下列 Python 指令碼會產生 `PUT` 預先簽章的 URL，可用於將物件上傳至 S3 一般用途儲存貯體。

1. 複製指令碼的內容，並將其儲存為 “*put-only-url.py*” 檔案。若要使用下列範例，請以您自己的資訊 (例如您的檔名) 取代*使用者輸入預留位置*。

   ```
   import argparse
   import boto3
   from botocore.exceptions import ClientError
   
   def generate_presigned_url(s3_client, client_method, method_parameters, expires_in):
       """
       Generate a presigned Amazon S3 URL that can be used to perform an action.
       
       :param s3_client: A Boto3 Amazon S3 client.
       :param client_method: The name of the client method that the URL performs.
       :param method_parameters: The parameters of the specified client method.
       :param expires_in: The number of seconds the presigned URL is valid for.
       :return: The presigned URL.
       """
       try:
           url = s3_client.generate_presigned_url(
               ClientMethod=client_method,
               Params=method_parameters,
               ExpiresIn=expires_in
           )
       except ClientError:
           print(f"Couldn't get a presigned URL for client method '{client_method}'.")
           raise
       return url
   
   def main():
       parser = argparse.ArgumentParser()
       parser.add_argument("bucket", help="The name of the bucket.")
       parser.add_argument(
           "key", help="The key (path and filename) in the S3 bucket.",
       )
       parser.add_argument(
           "--region", help="The AWS region where the bucket is located.", default="us-east-1"
       )
       parser.add_argument(
           "--content-type", help="The content type of the file to upload.", default="application/octet-stream"
       )
       args = parser.parse_args()
       
       # Create S3 client with explicit region configuration
       s3_client = boto3.client("s3", region_name=args.region)
       
       # Optionally set signature version if needed for older S3 regions
       # s3_client.meta.config.signature_version = 's3v4'
       
       # The presigned URL is specified to expire in 1000 seconds
       url = generate_presigned_url(
           s3_client, 
           "put_object", 
           {
               "Bucket": args.bucket, 
               "Key": args.key,
               "ContentType": args.content_type  # Specify content type
           }, 
           1000
       )
       print(f"Generated PUT presigned URL: {url}")
   
   if __name__ == "__main__":
       main()
   ```

1. 若要產生用於上傳檔案的 `PUT` 預先簽章 URL，請使用您的儲存貯體名稱和所需的物件路徑執行下列指令碼。

    下列命令使用範例值。以您自己的資訊取代*使用者輸入預留位置*。

   ```
   python put-only-url.py amzn-s3-demo-bucket <object-path> --region us-east-1 --content-type application/octet-stream
   ```

   指令碼將輸出 `PUT` 預先簽章的 URL：

   ```
   Generated PUT presigned URL: https://amzn-s3-demo-bucket.s3.amazonaws.com/object.txt?AWS AccessKeyId=AKIAIOSFODNN7EXAMPLE&Signature=vjbyNxybdZaMmLa%2ByT372YEAiv4%3D&Expires=1741978496
   ```

1. 您現在可以搭配 curl 使用產生的預先簽章 URL 來上傳檔案。請務必包含產生 URL 時使用的相同內容類型：

   ```
   curl -X PUT -T "path/to/your/local/file" -H "Content-Type: application/octet-stream" "generated-presigned-url"
   ```

   如果您在產生 URL 時指定不同的內容類型，請務必在 curl 命令中使用相同的內容類型。

如需使用 AWS SDKs 產生預先簽章 URL 以上傳物件的更多範例，請參閱[使用 AWS SDK 為 Amazon S3 建立預先簽章 URL](https://docs.aws.amazon.com/AmazonS3/latest/API/s3_example_s3_Scenario_PresignedUrl_section.html)。

**為 SignatureDoesNotMatch 錯誤進行故障診斷**  
如果您在使用預先簽章的 URL 時遇到錯誤 `SignatureDoesNotMatch`，請檢查下列項目：  
確認您的系統時間與可靠的時間伺服器同步
確保您完全按照產生的 URL 使用 URL，完全沒有修改
檢查 URL 是否已過期，並視需要產生新的 URL
請確定上傳請求中的內容類型，符合產生 URL 時指定的內容類型
確認您使用的是儲存貯體的正確區域
使用 curl 時，請以引號括住 URL，以正確處理特殊字元

------