3

League の AWS S3 v3 Flysystem を使用して、ローカルのハードディスクから Amazon S3 にファイルをアップロードしようとしています。これが私の機能です:

/**
 * Uploads a file from local disk to S3
 * @param $filename string
 * @param Illuminate\Filesystem\FilesystemAdapter $s3
 * @param Illuminate\Filesystem\FilesystemAdapter $local
 * @param string $path
 */
protected function uploadFile($filename, $s3, $local, $path)
{
    $file = substr($filename, strrpos($filename, '/') + 1);

    if($local->has($filename)) {
        try {
            Log::info("Uploading file", ['filename' => $filename, 'host' => gethostname()]);
            $s3->write($path . $file, $local->read($filename));

            return $path . $file;
        } catch(\Exception $e) {
            Log::error('Error uploading file', ['filename' => $filename, 'message' => $e->getMessage(), 'host' => gethostname()]);
            return false;
        }

    } 

    Log::notice('File does not exist on local disk, cannot upload', ['filename' => $filename, 'host' => gethostname() ]);
    return false;
}

何が変更されたのかは 100% わかりませんが、アップロードしようとすると AWS から次のエラーが表示されます。

AWS HTTP エラー: クライアント エラー応答 [url] https://s3.amazonaws.com/bucket/directory/file.ext?partNumber=1&uploadId=BigLoNGsTring_oF_CHaracTers.moREstuFF-- [ステータス コード] 400 [理由フレーズ] Bad Request XAmzContentSHA256Mismatch ( client): 提供された「x-amz-content-sha256」ヘッダーは、計算されたものと一致しません。

catch上記のコードでは、この文字列は、ブロックに渡される Exception のメッセージとして返される (非常に大きな XML 文字列) の一部です。

私が見つけることができるこのエラーに関するまばらな小さなビットを読んでわかることから、これは、アップロードの各部分のこのヘッダーに配置されているハッシュが何と一致しないため、送信したコンテンツが破損しているとS3が考えていることを何らかの形で示していますAmazon は、そうすべきであると判断します。

ある時点でこれが問題なく機能していたと確信していますが、どこからデバッグを開始すればよいかわかりません。ローカルファイルのアクセス許可により、誰でもそれを読み取ることができます。このファイルをアップロードしようとしている S3 バケットにディレクトリを正常に作成できるため、その側のアクセス許可とは関係がないと思います。

このエラーの意味を正しく理解していますか?

違いがある場合、S3 にアップロードしようとしているファイルは大きなビデオ ファイルです (通常は 250MB 超、2GB 未満)。

アップデート

この問題はローカルでも発生しているため、提案の 1 つを試してローカル コンピューターを再起動しましたが、問題は残ります。この同じ機能も使用する別のものを実行してみました (問題のビデオ ファイルの小さい jpg スクリーン ショットをアップロードします)。問題なくアップロードできました。詳細については、以下に呼び出しコードを示します。

$format->setKiloBitrate($kiloBitrate);
if(!$local->has($newFilename)) {
    $video->save($format, $newFilename);
    Log::debug($extension . '@' . $kiloBitrate . 'kbps Encoding Finished');
} else {
    Log::debug("File already encoded!");
}

if(!$this->uploadFile($newFilename, $s3, $local, $remotePath . $kiloBitrate . '/')) {
    Log::error("Failed to upload file", ['filename' => $newFilename, 'host' => gethostname()]);
} else {
    $local->delete($newFilename);
}

上記$videoは のインスタンスでFFMpeg\Media\Videoあり$format、 のインスタンスですFFMpeg\Format\Video\DefaultVideo。私が知っている限り、$video->save(...)後、ファイルに他の変更は加えられていません

アップデート #2

問題はなくなりました。これは回答ではないため、回答として投稿しません。これは私がしたことです:

$ composer update
Loading composer repositories with package information
Updating dependencies (including require-dev)                             
  - Removing aws/aws-sdk-php (3.1.0)
  - Installing aws/aws-sdk-php (3.2.0)
    Downloading: 100%

aws sdkの github のコミットを見ると、私の問題はこの提出された PR で修正された可能性があると思いますが、実際にはわかりません。

4

0 に答える 0