gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:08:11 31 4
gpt4 key购买 nike

我想将一个大视频文件上传到我的 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');
}

但现在我得到了这么长的错误:

CouldNotCreateChecksumException in SignatureV4.php line 148:

A sha256 checksum could not be calculated for the provided upload body, because it was not seekable. To prevent this error you can either 1) include the ContentMD5 or ContentSHA256 parameters with your request, 2) use a seekable stream for the body, or 3) wrap the non-seekable stream in a GuzzleHttp\Stream\CachingStream object. You should be careful though and remember that the CachingStream utilizes PHP temp streams. This means that the stream will be temporarily stored on the local disk.

所以我现在完全迷路了。我不知道我是否在正确的轨道上。以下是我试图理解的资源:

让我更加困惑的是,除了流之外,似乎还有另一种上传大文件的方法:所谓的"multipart" upload。 .我实际上认为这就是溪流的全部...

有什么区别?

最佳答案

我遇到了同样的问题,想出了这个解决方案。而不是使用

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 文档: http://docs.aws.amazon.com/aws-sdk-php/v3/guide/service/s3-multipart-upload.html

关于php - 如何使用 Laravel 5 和文件系统将大(视频)文件上传到 AWS S3?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30989133/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com