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

Mar*_*nJH 4 php file-upload amazon-s3 amazon-web-services laravel-5

我想将一个大视频文件上传到我的AWS S3存储桶.经过几个小时,我终于设法配置我的php.ininginx.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临时流.这意味着流将临时存储在本地磁盘上.

所以我现在完全迷失了.我无法弄清楚我是否走在正确的轨道上.以下是我尝试理解的资源:

只是为了让我更加困惑,似乎还有另一种方法来上传除流之外的大文件:所谓的"多部分"上传.我实际上认为这就是所有关于...

有什么不同?

Mir*_*cea 5

流媒体部分适用于下载。

对于上传,您需要知道内容大小。对于大文件,分段上传是最佳选择。


Haz*_*azA 5

我遇到了同样的问题并提出了这个解决方案.而不是使用

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