Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用boto';将文件放在S3上时,如何正确传递Content-MD5头文件;s Key.generate_url方法?_Python_Amazon S3_Python Requests_Boto - Fatal编程技术网

Python 使用boto';将文件放在S3上时,如何正确传递Content-MD5头文件;s Key.generate_url方法?

Python 使用boto';将文件放在S3上时,如何正确传递Content-MD5头文件;s Key.generate_url方法?,python,amazon-s3,python-requests,boto,Python,Amazon S3,Python Requests,Boto,我有一个Python应用程序,使用boto,我给用户一个临时URL,以便将文件上传到S3存储桶 用户的上传访问受到限制,我使用boot的键。generate_url方法创建一个临时url,该url接受PUT请求 我可以很好地工作,但是我想确保在生成密钥和实际上传之间不会修改用户负载 因此,我尝试使用S3的Content-MD5支持来确保校验和匹配 但是,当我向代码添加Content-MD5头时,PUT请求失败 在下面的代码示例中,如果我为每个步骤(geturl和uploadfile)删除Cont

我有一个Python应用程序,使用boto,我给用户一个临时URL,以便将文件上传到S3存储桶

用户的上传访问受到限制,我使用boot的
键。generate_url
方法创建一个临时url,该url接受
PUT
请求

我可以很好地工作,但是我想确保在生成密钥和实际上传之间不会修改用户负载

因此,我尝试使用S3的
Content-MD5
支持来确保校验和匹配

但是,当我向代码添加
Content-MD5
头时,
PUT
请求失败

在下面的代码示例中,如果我为每个步骤(geturl和uploadfile)删除Content-MD5头,那么一切都会按预期工作

注意:我已经验证了我的校验和是正确的:如果我上传一个没有
Content-MD5
头的文件,那么我就可以访问S3上的MD5,并且它确实与我的本地哈希匹配

以下是我获得钥匙的方法:

# geturl
# s3key is a Key instance
# _file is a dict with some info on a file to be uploaded
s3headers = {
    'Content-Length': _file['length'],
    'Content-MD5': _file['md5']
}
s3url = s3key.generate_url(self.ACCESS_KEY_EXPIRES_IN, 'PUT',
                           headers=s3headers, force_http=True)
_parsed = compat.parse.urlparse(s3url)
_file['upload_url'] = '{0}://{1}{2}'.format(_parsed.scheme, _parsed.netloc, _parsed.path)
_file['upload_params'] = compat.parse.parse_qs(_parsed.query)
下面是我上传文件的方式:

# uploadfile
headers = {'Content-Length': _file['length'],
       'Content-MD5': _file['md5'],
       'Content-Type': None,
       'Connection': None,
       'User-Agent': None,
       'Accept-Encoding': None,
       'Accept': None
}
stream = io.open(_file['local'])
response = requests.put(_file['upload_url'], data=stream, headers=headers, params=_file['upload_params'])

答案是在Python3上,在我的设置中,MD-5散列是一个字节字符串,其他所有内容都是一个文本字符串。解决方案是在将字节字符串添加到标题之前对其进行解码

以前,我的校验和(
_file['md5']
)是这样做的:

checksum = base64.b64encode(hasher.digest())
现在是:

checksum = base64.b64encode(hasher.digest()).decode('utf-8')

答案是在Python3上,在我的设置中,MD-5散列是一个字节字符串,其他所有内容都是一个文本字符串。解决方案是在将字节字符串添加到标题之前对其进行解码

以前,我的校验和(
_file['md5']
)是这样做的:

checksum = base64.b64encode(hasher.digest())
现在是:

checksum = base64.b64encode(hasher.digest()).decode('utf-8')

答案是在Python3上,在我的设置中,MD-5散列是一个字节字符串,其他所有内容都是一个文本字符串。解决方案是在将字节字符串添加到标题之前对其进行解码

以前,我的校验和(
_file['md5']
)是这样做的:

checksum = base64.b64encode(hasher.digest())
现在是:

checksum = base64.b64encode(hasher.digest()).decode('utf-8')

答案是在Python3上,在我的设置中,MD-5散列是一个字节字符串,其他所有内容都是一个文本字符串。解决方案是在将字节字符串添加到标题之前对其进行解码

以前,我的校验和(
_file['md5']
)是这样做的:

checksum = base64.b64encode(hasher.digest())
现在是:

checksum = base64.b64encode(hasher.digest()).decode('utf-8')

您是否已在请求中启用调试以查看正在发送的实际HTTP请求,包括标头?那可能很有趣。是的,当然有。它发送的正是我要求它发送的内容:
Content-Length
Content-MD5
-我之所以将这些其他头设置为
None
,是为了删除S3不期望的头。您是否在请求中启用了调试以查看发送的实际HTTP请求,包括头?那可能很有趣。是的,当然有。它发送的正是我要求它发送的内容:
Content-Length
Content-MD5
-我之所以将这些其他头设置为
None
,是为了删除S3不期望的头。您是否在请求中启用了调试以查看发送的实际HTTP请求,包括头?那可能很有趣。是的,当然有。它发送的正是我要求它发送的内容:
Content-Length
Content-MD5
-我之所以将这些其他头设置为
None
,是为了删除S3不期望的头。您是否在请求中启用了调试以查看发送的实际HTTP请求,包括头?那可能很有趣。是的,当然有。它发送的正是我要求它发送的内容:
Content-Length
Content-MD5
——我将这些其他头设置为
None
的原因是删除S3不期望的头。