求Python上传AWS WorkDocs示例代码,PUT请求遇签名不匹配错误
解决AWS WorkDocs上传时的SignatureDoesNotMatch错误
我来帮你搞定这个AWS WorkDocs的上传问题!你遇到的SignatureDoesNotMatch错误,核心原因是你用了requests的files参数,导致请求格式不符合WorkDocs的要求。
问题根源
当你使用upfile={'file': ('file.pdf', open('file.pdf', 'rb'), 'application/octet-stream')}作为put方法的参数时,requests会自动将请求的Content-Type改为multipart/form-data,还会添加额外的boundary分隔符和表单字段信息。但AWS WorkDocs期望的是纯二进制流的PUT请求(Content-Type为application/octet-stream),这种格式差异导致AWS计算的签名和你提供的签名不匹配。
正确的Python上传示例代码
你需要直接将文件的二进制内容作为请求体发送,而不是用files参数:
import requests # 替换为你通过AWS API获取到的有效上传URL workdocs_upload_url = "https://d91s3498sxxxxx.awsworkdocs.com/updocs/xxxxxx" # 读取文件的二进制内容 with open("file.pdf", "rb") as pdf_file: file_binary = pdf_file.read() # 设置正确的请求头 request_headers = { "Content-Type": "application/octet-stream" } # 发起PUT请求 response = requests.put(workdocs_upload_url, data=file_binary, headers=request_headers) # 处理响应结果 if response.status_code == 200: print("文件成功上传到AWS WorkDocs啦!") else: print(f"上传失败,状态码: {response.status_code}") print("错误详情:", response.text)
额外注意事项
- 确保你使用的上传URL是通过AWS WorkDocs的API(比如
CreateDocument或InitiateDocumentVersionUpload)生成的有效URL,这类URL通常有有效期,过期后需要重新生成。 - 如果你的场景需要手动计算请求签名(比如没有使用AWS SDK自动签名),一定要确保签名是基于
application/octet-stream的Content-Type和纯二进制请求体来计算的。 - 对于大文件,建议使用分块上传的方式,但小文件用上面的方法就足够稳定。
内容的提问来源于stack exchange,提问作者Jon
相关产品推荐
相关产品推荐

