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 で修正された可能性があると思いますが、実際にはわかりません。