python azure blob存储md5检查使用put_block_blob_from_path对blob上传失败

时间:2016-01-21 02:17:26

标签: python azure hash md5 azure-storage-blobs

我正在尝试使用python sdk将blob上传到azure blob存储。我希望在上传后在服务器端传递MD5哈希以进行验证。

以下是代码:

blob_service.put_block_blob_from_path(
        container_name='container_name',
        blob_name='upload_dir/'+object_name,
        file_path=object_name,
        content_md5=object_md5Hash
)

但是我收到了这个错误:

AzureHttpError: The MD5 value specified in the request did not match with the MD5 value calculated by the server.

文件大约200mb,错误立即抛出。不上传文件。所以我怀疑它可能是将提供的哈希值与第一个块或其他东西的哈希值进行比较。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

这是一种SDK错误,因为我们应该抛出更好的错误消息而不是点击服务,但验证必须分块的大型上传内容根本不起作用。 x_ms_blob_content_md5将存储md5,但服务不会验证它。这是你可以下载的东西。 content_md5由服务器验证特定请求的正文,但由于存在多个具有分块blob的内容,因此它将无法工作。

因此,如果blob足够小(低于BLOB_MAX_DATA_SIZE)要放入单个请求中,content_md5将正常工作。否则,我建议您使用HTTPS并将MD5存储在x_ms_blob_content_md5中,如果您认为可能要下载HTTP并在下载时验证它。 HTTPS已经为线路上的位翻转提供了验证,因此使用它进行上传/下载将会做很多事情。如果由于某种原因无法使用HTTPS上传/下载,您可以考虑使用put块并放置阻止列表API来自行分块blob。

仅供参考:在未来的版本中,我们打算为库中的单个放置和分块操作添加自动MD5计算,这将完全解决这个问题。对于下一个版本,如果为分块下载指定了content_md5,我们将添加一条改进的错误消息。

答案 1 :(得分:0)

我查看了Azure Blob Storage SDK的函数put_block_blob_from_path的源代码。它在功能评论中解释了这个案例,请参阅下面的内容并参考https://github.com/Azure/azure-storage-python/blob/master/azure/storage/blob/blobservice.py

  

<强> content_md5

     

可选。 blob内容的MD5哈希值。这个哈希用于      在运输过程中验证blob的完整性。当这个标题      如果指定,则存储服务会检查已到达的哈希值      与发送的那个。如果两个哈希值不匹配,那么      操作将失败,错误代码为400(错误请求)。

答案 2 :(得分:0)

我认为这里有两件事情。

  • SDK中的错误 - 我相信您发现了SDK中的错误。我在Github上查看了这个函数的源代码,我发现当一个大块blob以块的形式上传时,SDK首先尝试创建一个空块blob。使用块blob,这不是必需的。当它创建空块blob时,它不会发送任何数据。但是你设置的是content-md5,SDK会将你发送的内容-md5与空内容的内容-md5进行比较,因为它们不匹配,就会出错。

要解决此问题,请修改blobservice.py中的源代码并注释掉以下代码行:

    self.put_blob(
        container_name,
        blob_name,
        None,
        'BlockBlob',
        content_encoding,
        content_language,
        content_md5,
        cache_control,
        x_ms_blob_content_type,
        x_ms_blob_content_encoding,
        x_ms_blob_content_language,
        x_ms_blob_content_md5,
        x_ms_blob_cache_control,
        x_ms_meta_name_values,
        x_ms_lease_id,
    )

我在Github上为此创建了一个新问题:https://github.com/Azure/azure-storage-python/issues/99

  • 使用不正确 - 我注意到您在content_md5参数中传递了文件的md5哈希值。这不适合你。您应该在x_ms_blob_content_md5参数中传递md5哈希。所以你的电话应该是:
blob_service.put_block_blob_from_path(
        container_name='container_name',
        blob_name='upload_dir/'+object_name,
        file_path=object_name,
        x_ms_blob_content_md5=object_md5Hash
)