Mar*_*nJH 4 php file-upload amazon-s3 amazon-web-services laravel-5
我想将一个大视频文件上传到我的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');
}
Run Code Online (Sandbox Code Playgroud)
但现在我得到这个长期错误:
SignatureV4.php第148行中的CouldNotCreateChecksumException:
无法为提供的上载正文计算sha256校验和,因为它不可搜索.要防止出现此错误,您可以1)在您的请求中包含ContentMD5或ContentSHA256参数,2)为正文使用可搜索流,或者3)将不可搜索流包装在GuzzleHttp\Stream\CachingStream对象中.你应该小心,并记住CachingStream使用PHP临时流.这意味着流将临时存储在本地磁盘上.
所以我现在完全迷失了.我无法弄清楚我是否走在正确的轨道上.以下是我尝试理解的资源:
只是为了让我更加困惑,似乎还有另一种方法来上传除流之外的大文件:所谓的"多部分"上传.我实际上认为这就是所有关于...
有什么不同?
我遇到了同样的问题并提出了这个解决方案.而不是使用
Storage::put('file.jpg', $contents);
Run Code Online (Sandbox Code Playgroud)
当然遇到了"内存不足错误",我使用了这种方法:
public function uploadToS3($fromPath, $toPath)
{
$disk = Storage::disk('s3');
$uploader = new MultipartUploader($disk->getDriver()->getAdapter()->getClient(), $fromPath, [
'bucket' => Config::get('filesystems.disks.s3.bucket'),
'key' => $toPath,
]);
try {
$result = $uploader->upload();
echo "Upload complete";
} catch (MultipartUploadException $e) {
echo $e->getMessage();
}
}
Run Code Online (Sandbox Code Playgroud)
用Laravel 5.1测试
以下是官方AWS PHP SDK文档:http: //docs.aws.amazon.com/aws-sdk-php/v3/guide/service/s3-multipart-upload.html
归档时间: |
|
查看次数: |
4124 次 |
最近记录: |