【发布时间】:2015-09-08 10:43:06
【问题描述】:
我想将一个大视频文件上传到我的 AWS S3 存储桶。经过好几个小时,我终于设法配置了我的 php.ini 和 nginx.conf 文件,所以它们允许更大的文件。
但后来我收到了"Fatal Error: Allowed Memory Size of XXXXXXXXXX Bytes Exhausted"。一段时间后,我发现更大的文件应该使用fopen()、fwrite() 和fclose() 与流一起上传。
由于我使用的是 Laravel 5,因此文件系统会处理大部分内容。除了我无法让它工作。
我当前的ResourceController@store 看起来像这样:
public function store(ResourceRequest $request)
{
/* Prepare data */
$resource = new Resource();
$key = 'resource-'.$resource->id;
$bucket = env('AWS_BUCKET');
$filePath = $request->file('resource')->getRealPath();
/* Open & write stream */
$stream = fopen($filePath, 'w');
Storage::writeStream($key, $stream, ['public']);
/* Store entry in DB */
$resource->title = $request->title;
$resource->save();
/* Success message */
session()->flash('message', $request->title . ' uploadet!');
return redirect()->route('resource-index');
}
但是现在我得到了这个很长的错误:
SignatureV4.php 第 148 行中的CouldNotCreateChecksumException:
无法为提供的上传正文计算 sha256 校验和,因为它不可搜索。为防止出现此错误,您可以 1) 在请求中包含 ContentMD5 或 ContentSHA256 参数,2) 为正文使用可搜索流,或 3) 将不可搜索流包装在 GuzzleHttp\Stream\CachingStream 对象中。不过,您应该小心并记住 CachingStream 使用 PHP 临时流。这意味着流将被临时存储在本地磁盘上。
所以我现在完全迷路了。我什至不知道我是否走在正确的轨道上。以下是我试图理解的资源:
- AWS SDK guide for PHP: Stream Wrappers
- AWS SDK introduction on stream wrappers
- Flysystem original API on stream wrappers
更让我困惑的是,除了流之外,似乎还有另一种上传大文件的方法:所谓的"multipart" upload。我实际上认为这就是溪流的全部意义所在......
有什么区别?
【问题讨论】:
标签: php amazon-web-services file-upload amazon-s3 laravel-5