Php 如何使用Laravel 5和文件系统将流式大文件(视频)上传到AWS S3?
我想上传一个大的视频文件到我的AWS S3存储桶。几个小时后,我终于成功地配置了php.ini和nginx.conf文件,因此它们允许使用更大的文件 但是我得到了一个Php 如何使用Laravel 5和文件系统将流式大文件(视频)上传到AWS S3?,php,amazon-web-services,file-upload,amazon-s3,laravel-5,Php,Amazon Web Services,File Upload,Amazon S3,Laravel 5,我想上传一个大的视频文件到我的AWS S3存储桶。几个小时后,我终于成功地配置了php.ini和nginx.conf文件,因此它们允许使用更大的文件 但是我得到了一个“致命错误:允许的内存大小XXXXXXXXX字节已用尽”。过了一段时间,我发现应该使用fopen()、fwrite()和fclose()上传较大的文件和流 因为我使用的是Laravel5,所以文件系统会处理其中的大部分内容。除了我不能让它工作 我当前的ResourceController@store如下所示: public func
“致命错误:允许的内存大小XXXXXXXXX字节已用尽”
。过了一段时间,我发现应该使用fopen()
、fwrite()
和fclose()
上传较大的文件和流
因为我使用的是Laravel5,所以文件系统会处理其中的大部分内容。除了我不能让它工作
我当前的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临时流。这意味着流将临时存储在本地磁盘上
所以我现在完全迷路了。我不知道我是否走对了路。以下是我试图理解的资源:
区别是什么?流媒体部分适用于下载
对于上传,您需要知道内容大小。对于大文件,多部分上传是一种方法。我也遇到了同样的问题,并提出了这个解决方案。 而不是使用
Storage::put('file.jpg', $contents);
当然遇到了“内存不足错误”,我使用了以下方法:
use Aws\S3\MultipartUploader;
use Aws\Exception\MultipartUploadException;
// ...
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();
}
}
使用Laravel 5.1进行测试
以下是AWS PHP SDK的官方文档:
到目前为止,你在澄清我应该关注的问题上获得了一张赞成票。如果你能提供一个工作代码示例,我也会给你打勾。如果在我自己弄明白之前没有更好的答案,你会得到选中标记。谢谢你的时间!AWS多部分上传工作完美!但是上传屏蔽了页面好长时间了,所以我想我现在要去学习ajax了。。。干杯嗨,哈扎,你能帮我吗?你是如何添加多端口加载程序类以便在像UploadController这样的控制器上使用的?谢谢!