如何使用Laravel将上传图像修复到s3

时间:2019-05-13 02:27:36

标签: php laravel amazon-s3

我尝试使用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ڱ���.......

3 个答案:

答案 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设置放入.envconfig\filesystems.php

然后更新config\filesystems中的默认文件系统,或在使用存储设备Storage::disk('s3')时指示磁盘驱动器

详细信息,请参见文档here

答案 1 :(得分:0)

您必须使用SourceFile而不是BodySourceFile是文件的路径,但是您没有文件,但是具有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