3

我有一个上传视频的 PHP 应用程序(从小的 - 1MB - 到大的 - 400MB)。

一切正常,除了一些特定的文件。

这些文件总是出现 MD5 校验和错误:

WS 错误代码:BadDigest,状态代码:400,AWS 请求 ID:89BBC1D79A4492A7,AWS 错误类型:客户端,AWS 错误消息:您指定的 Content-MD5 与我们收到的不匹配。

我验证了 MD5,它确实不匹配,但我不知道为什么!

如果是损坏错误,则返回的 S3 MD5 会有所不同,但始终相同。

在我的本地机器(Mac)和服务器(Ubuntu)上,MD5 是:

9131ee88a194b555d0a3519f67294f31

在亚马逊,它是:

8e6789baf9c5d434003a5443d30143fa

使用以下代码摘录进行上传:

    try
    {
        $start = (float) array_sum(explode(' ',microtime()));

        $save_path = "/tmp/$video[quality]/$video[video_id].mp4";
        $db_path = "$video[channel]/$video[quality]/$video[video_id].mp4";
        $bytes = number_format(filesize($save_path) / 1048576, 2) . ' MB';

        System_Daemon::info(($i + 1) . "/$num_of_videos - started upload of $video[channel] - $video[video_id] with $bytes");

        $s3 = Aws\S3\S3Client::factory(
                        array(
                            'key' => 'MY KEY',
                            'secret' => 'MY SECRET',
                            'region' => Region::US_EAST_1
                        )
        );


        $results = $s3->putObject(array(
            'Bucket' => 'media.tubelivery.com',
            'Key' => $db_path,
            'Body' => fopen($save_path, 'r'),
            'ACL' => Aws\S3\Enum\CannedAcl::PUBLIC_READ
                ));

        //Delete the original file
        unlink($save_path);
        clearstatcache($save_path);

        //Change the video state to 0
        update_video_state_to_uploaded_to_S3($video['id']);

        $end = (float) array_sum(explode(' ',microtime()));
        $time = sprintf("%.4f", ($end - $start)) . " sec";

        System_Daemon::info("uploaded video " . ($i + 1) . " to $db_path in $time");
    }
    catch (Aws\S3\Exception\S3Exception $e)
    {
        System_Daemon::err("ERROR uploading $video[video_id].mp4 to S3");
        foreach($results as $key => $result)
        {
            System_Daemon::err("$key => $result");
        }
        $save_path = "/tmp/$video[quality]/$video[video_id].mp4";   
        clearstatcache($save_path);
        System_Daemon::err("ERROR: $e");
    }

这是确切的日志:

[Mar 13 02:35:53]      err: ERROR uploading 4XwKKMlGibo.mp4 to S3 [l:145]
[Mar 13 02:35:53]      err: Expiration =>  [l:148]
[Mar 13 02:35:53]      err: ServerSideEncryption =>  [l:148]
[Mar 13 02:35:53]      err: ETag => "7f65e3f892d96b9703d411219e2b868a" [l:148]
[Mar 13 02:35:53]      err: VersionId =>  [l:148]
[Mar 13 02:35:53]      err: RequestId => 80821CC621946236 [l:148]
[Mar 13 02:35:53]      err: ERROR: Aws\S3\Exception\BadDigestException: 
                            AWS Error Code: BadDigest, 
                            Status Code: 400, 
                            AWS Request ID: 7C4B4834C6235D1A, 
                            AWS Error Type: client, 
                            AWS Error Message: The Content-MD5 you specified did not match what we received. [l:152]

有任何想法吗?我究竟做错了什么?

4

1 回答 1

2

我正在使用 S3 进行大型数据传输,并收到完全相同的错误消息。事实证明,我们使用的库对超过一定大小的文件使用了分段上传功能。我不确定 PHP SDK 是否做同样的事情,但显然多部分对象存储在 S3 中的方式导致生成的哈希值与在本地计算机上生成的哈希值不同。

我看到这个问题很老了,但想让你知道你并不孤单!

于 2015-04-09T21:29:41.113 回答