【发布时间】:2019-09-13 19:32:16
【问题描述】:
我没有成功尝试使用预签名部分 URL 进行分段上传。
这是我遵循的过程(1-3在服务器端,4在客户端):
- 实例化 boto 客户端。
import boto3
from botocore.client import Config
s3 = boto3.client(
"s3",
region_name=aws.default_region,
aws_access_key_id=aws.access_key_id,
aws_secret_access_key=aws.secret_access_key,
config=Config(signature_version="s3v4")
)
- 启动分段上传。
upload = s3.create_multipart_upload(
Bucket=AWS_S3_BUCKET,
Key=key,
Expires=datetime.now() + timedelta(days=2),
)
upload_id = upload["UploadId"]
- 为部分上传创建一个预签名 URL。
part = generate_part_object_from_client_submited_data(...)
part.presigned_url = s3.generate_presigned_url(
ClientMethod="upload_part",
Params={
"Bucket": AWS_S3_BUCKET,
"Key": upload_key,
"UploadId": upload_id,
"PartNumber": part.no,
"ContentLength": part.size,
"ContentMD5": part.md5,
},
ExpiresIn=3600, # 1h
HttpMethod="PUT",
)
将预签名的 URL 返回给客户端。
- 在客户端尝试使用
requests上传该部分。
part = receive_part_object_from_server(...)
with io.open(filename, "rb") as f:
f.seek(part.offset)
buffer = io.BytesIO(f.read(part.size))
r = requests.put(
part.presigned_url,
data=buffer,
headers={
"Content-Length": str(part.size),
"Content-MD5": part.md5,
"Host": "AWS_S3_BUCKET.s3.amazonaws.com",
},
)
当我尝试上传时,我得到:
urllib3.exceptions.ProtocolError:
('Connection aborted.', BrokenPipeError(32, 'Broken pipe'))
或者:
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>NoSuchUpload</Code>
<Message>
The specified upload does not exist. The upload ID may be invalid,
or the upload may have been aborted or completed.
</Message>
<UploadId>CORRECT_UPLOAD_ID</UploadI>
<RequestId>...</RequestId>
<HostId>...</HostId>
</Error>
即使上传仍然存在并且我可以列出它。
谁能告诉我我做错了什么?
【问题讨论】:
-
你的代码对我来说是孤立的,有一个小部分类。您如何处理完整的分段上传请求?您确定在客户上传之前它没有被解雇吗?您确定您发送给客户的 URL 没有以某种方式进行转换吗?您已经非常接近拥有一个简单的测试台了,我会将其变成一个简单的端到端测试台,仅用于分段上传以验证代码,尽管我怀疑问题出在未显示的代码中。跨度>
-
我也在尝试使用预签名的 URL 执行分段上传。你能建议你是如何克服这个问题的吗?
标签: python amazon-web-services amazon-s3 boto3