Amazon S3巨大的文件完整性



我对如何检查上传到Amazon S3的文件的完整性感到非常困惑。我可以看到一些关于此问题的堆叠问题,但是它们似乎使用了较旧的API,它们看起来与我现在使用的内容截然不同,并且它们指的是包含MD5的E-TAG,似乎已不再有效,或者对于5GB的文件。

因此,基本上,我正在使用PHP上传巨大文件(其中一些超过70GB),使用MultipartuPloader进行尝试/捕获:

        try {
            $result = $uploader->upload();
        } catch (MultipartUploadException $e) {
            $uploader = new MultipartUploader($s3, $file, array(
                'state' => $e->getState()
            ));
        }

我有几个错误的错误:

将零件上传到多个上传时发生了例外。以下部分有错误: - 第7729部分:执行" uploadPart" ON的错误...导致500 Internal Server Error响应: internalerror 我们遇到了内部错误。请求(截断...) InternalRor(服务器):我们遇到了内部错误。请再试一次。 - internalerror 我们遇到了内部错误。请重试。

第660部分:执行" uploadpart" ..."的错误错误;AWS http错误:卷曲错误56:SSL读取:错误:00000000:lib(0):func(0):quasin(0),errno 104(请参阅http://curl.haxx.se/libcurl/c/libcurl-c/libcurl----errors.html)(服务器):100继续 -

第6542部分:执行" uploadpart" ..."的错误错误;AWS http错误:卷曲错误52:从服务器中取空回复(请参阅http://curl.haxx.se/libcurl/c/libcurl-errors.html)

所有这些似乎都属于" Multipartuploadexception"的捕获,它试图从当前状态再次上传。

,但我仍然担心上传文件的完整性,所以我想知道如何检查。当我在S3管理控制台中查看时,一个文件的属性说:

ETAG:BA66D1235F954F28366DDC0A7EFCB295-1609

但是当我在本地进行" MD5SUM"时,我会得到完全不同的东西:

FA693AF7341C6C83E525EBC6B95422EA

这是否意味着上传的文件已损坏?

如果没有,检查上传文件的完整性的方法是什么?

在多部分上载上,ETAG是通过取二进制编码&sup1来计算的。在每个部分的MD5哈希中,将它们连接在一起,进行其中的MD5,对结果进行编码,然后附加-,然后是零件数。

如果您知道上传零件大小,则可以计算给定文件的正确多部分ETAG值。我编写了一个S3 Multipart上传器(未发行),该上传器预先计算此值并将其存储为x-amz-meta-expect-etag,以进行以后的手动或机器验证。在某个地方,我可能有一个独立的实用程序,该实用程序在事实之后从本地文件中计算出来。我会寻找的。

您要谨慎是正确的,但您的担忧可能在很大程度上没有根据。如果您使用的库利用了内置到多部分API中的故障保护,则应该很好:

上传时,每个部分应发送一个Content-MD5标头,其中包含该部分的MD5哈希的基本64编码。如果请求中存在这一点,则S3将故意不接受该部分,因为该数据被认为已在运输中被损坏。

上传时,每个部分都会收到一个响应,其中包含该部分的ETAG,其中包含零件的MD5在十六进制中。代码应验证该值。

然后,

s3要求您在所有零件完成时组装"完整"请求以最终确定上传。在此请求中,您包含各个部分的所有ETAG,您应该在上传时在本地维护。(有一种方法可以询问列表的S3,但这是用于交叉检查的,并且该数据不应实际组装完整的multipart-upload请求。如果这些值不像S3那样,那么它们应该应该是请求失败,并且对象永远不会存在。

因此,做得正确,S3 Multipart上传非常擅长确保数据完整性...它很难不让您弄错它并创建不完美的对象。您应该审核您使用的库的代码来验证它们是否做这些事情。如果他们这样做,你应该很好。在So写的内部系统的早期版本中,我实际上使用curl 'https://{pre-signed-url}' | md5sum在每个Multipart上传后进行验证。它以这种方式运行了几年,我从字面上从未设法创建一个不良的多部分上传,当使用所有和编写的代码直接使用提供的保障措施直接与S3服务(no sdk)交谈由Multipart Api。


¹ md5哈希是一个128位值。它的"二进制编码"(不是一个精确的术语,因为它不是真正的"编码"," Just" Raw)是16个字节值,每个字节都包含一个值为0-255的值。如果MD5哈希的字节仅仅是字符串,则许多字节会导致不打印的字符...因此,共同表示形式在十六进制中,导致32个字节(128&Divide; 4)输出(使用字符使用字符)0-9,a-f),因为每个十六进制字符仅编码4位...或在base64(字符0-9a-Za-Z/=)中,您获得24个字节(128&Divide; 6)4)输出的下一个倍数,因为每个字符编码6位。您不连接32字节十六进制编码,您需要每个部分的MD5的原始二进制版本,每个版本是16个字节。

上传到S3时,保证复制保真度(完美传递)的唯一方法是使用校验和。为了使此易于管理,AWS允许您将文件分为部分,计算校验和,然后将其作为签名的一部分以及" content-md5"标题发送。

您可以假设您发布到S3的内容没有错误是不正确的。

AWS将API请求返回500或其他错误并不是很少见。这是记录的,这是AWS要求您只是在这种情况下再次尝试的原因之一。

AWS S3 Multipart上传的巨大好处主要是复制保真度,上传恢复Incase Incase Incase Incase(您只需要重试零件,而不是整个文件),如果您有一个非常胖的管道用于改进的吞吐量。

在https://github.com/ttlabs/evaporatejs上有一个非常受欢迎的基于浏览器的实现,因为AWS JavaScript SDK用于浏览器,但没有任何内容(除了任何东西)中没有支持校验和二进制视频,图像,音乐)。

最新更新