我尝试使用Laravel将图像上传到s3,但收到运行时错误。我通过body base64发送的与邮递员一起使用Laravel 5.8,PHP7和API REST 我收到一张base64图片,必须上传到s3并获取请求URL。
public function store(Request $request)
{
$s3Client = new S3Client([
'region' => 'us-east-2',
'version' => 'latest',
'credentials' => [
'key' => $key,
'secret' => $secret
]
]);
$base64_str = substr($input['base64'], strpos($input['base64'], ",") + 1);
$image = base64_decode($base64_str);
$result = $s3Client->putObject([
'Bucket' => 's3-galgun',
'Key' => 'saraza.jpg',
'SourceFile' => $image
]);
return $this->sendResponse($result['ObjectURL'], 'message.', 'ObjectURL');
}
说:
RuntimeException:无法打开u.Zf. {��zڱ���.......
答案 0 :(得分:1)
SourceFile
参数导致文件的 path 上载到S3,而不是二进制文件
您可以使用Body
参数替换SourceFile
,或将文件保存到本地临时文件并获取SourceFile
的路径
像这样:
public function store(Request $request)
{
$s3Client = new S3Client([
'region' => 'us-east-2',
'version' => 'latest',
'credentials' => [
'key' => $key,
'secret' => $secret
]
]);
$base64_str = substr($input['base64'], strpos($input['base64'], ",") + 1);
$image = base64_decode($base64_str);
Storage::disk('local')->put("/temp/saraza.jpg", $image);
$result = $s3Client->putObject([
'Bucket' => 's3-galgun',
'Key' => 'saraza.jpg',
'SourceFile' => Storage::disk('local')->path('/temp/saraza.jpg')
]);
Storage::delete('/temp/saraza.jpg');
return $this->sendResponse($result['ObjectURL'], 'message.', 'ObjectURL');
}
并且,如果您将S3与Laravel一起使用,则应考虑使用S3文件系统驱动程序,而不是在控制器中手动访问S3Client
为此,添加S3驱动程序composer require league/flysystem-aws-s3-v3
,将S3 IAM设置放入.env
或config\filesystems.php
然后更新config\filesystems
中的默认文件系统,或在使用存储设备Storage::disk('s3')
时指示磁盘驱动器
详细信息,请参见文档here
答案 1 :(得分:0)
您必须使用SourceFile
而不是Body
。 SourceFile
是文件的路径,但是您没有文件,但是具有base64编码的img源。这就是为什么您需要使用可以为字符串的Body
的原因。此处更多内容:https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#putobject
固定版本:
public function store(Request $request)
{
$s3Client = new S3Client([
'region' => 'us-east-2',
'version' => 'latest',
'credentials' => [
'key' => $key,
'secret' => $secret
]
]);
$base64_str = substr($input['base64'], strpos($input['base64'], ",") + 1);
$image = base64_decode($base64_str);
$result = $s3Client->putObject([
'Bucket' => 's3-galgun',
'Key' => 'saraza.jpg',
'Body' => $image
]);
return $this->sendResponse($result['ObjectURL'], 'message.', 'ObjectURL');
}
答案 2 :(得分:0)
一种非常简单的方法上载AWS-S3存储中的任何文件。
首先,检查您的ENV设置。
Use({ meow: true })
第二个 FileStorage.php
AWS_ACCESS_KEY_ID=your key
AWS_SECRET_ACCESS_KEY= your access key
AWS_DEFAULT_REGION=ap-south-1
AWS_BUCKET=your bucket name
AWS_URL=Your URL
现在进入主要代码。 从HTML表单上传二进制文件。
's3' => [
'driver' => 's3',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION'),
'bucket' => env('AWS_BUCKET'),
'url' => env('AWS_URL'),
//'visibility' => 'public', // do not use this line for security purpose. try to make bucket private.
],
上传Base64文件 用于“公共存储桶”或要保持文件公共状态
$fileName = 'sh_'.mt_rand(11111,9999).".".$imageFile->clientExtension();;
$s3path = "/uploads/".$this::$SchoolCode."/";
Storage::disk('s3')->put($s3path, file_get_contents($req->file('userDoc')));
用于“私有存储桶”或要保留文件私有状态
$binary_data = base64_decode($file);
Storage::disk('s3')->put($s3Path, $binary_data, 'public');
我建议您将文件保密...这是一种更安全,更安全的方法。为此,您必须使用PreSign in URL来访问该文件。
对于预登录URL ,请查看此信息。 How access image in s3 bucket using pre-signed url