Php 如何使用Laravel 5和文件系统将流式大文件(视频)上传到AWS S3?

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

我想上传一个大的视频文件到我的AWS S3存储桶。几个小时后,我终于成功地配置了php.ini和nginx.conf文件,因此它们允许使用更大的文件

但是我得到了一个
“致命错误:允许的内存大小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这样的控制器上使用的?谢谢!