如何将 base64 图像转换为 UploadedFile Laravel

met*_*eti 3 laravel vue.js

版本: 2.6.10

Laravel 版本: 6.0

我正在使用这个vue 上传包,在客户端一切正常(至少我是这么认为的)。但是在我使用 laravel 的服务器端,有一些问题。

这是我的 vue 发送方法:

        setImage: function (file) {
            let formData = new FormData();
            formData.append('file', file);
            axios.post(upload_route, formData , {
                headers: { 'Content-Type': 'multipart/form-data' }
            })
                .then(response => {
                    // upload successful
                })
                .catch(error => console.log(error));
        },
Run Code Online (Sandbox Code Playgroud)

这是我的服务器端方法:

    public function upload(Request $request){
        $path = $request->file('file')->store('avatars');
        return response('upload success' , 200);
    }
Run Code Online (Sandbox Code Playgroud)

当我将文件上传到服务器时,它给了我这个错误:

"message": "在 null 上调用成员函数 store()",

我在setImage函数中发送的文件对象是这样的(如果我用 console.log 记录它):

data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE...
Run Code Online (Sandbox Code Playgroud)

nmf*_*one 12

我相信file参数 onsetImage不是一个File对象。所以$request->file('file')is null,因为你附加了一个string(base64),而不是一个文件。

您告诉我们输出console.log是 base64 路径,然后您需要将其 (base64) 转换为文件。

由于您使用的是 Laravel,因此技术如下:

use Illuminate\Support\Str;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
use Symfony\Component\HttpFoundation\File\File;

.....

$base64File = $request->input('file');

// decode the base64 file
$fileData = base64_decode(preg_replace('#^data:image/\w+;base64,#i', '', $base64File));

// save it to temporary dir first.
$tmpFilePath = sys_get_temp_dir() . '/' . Str::uuid()->toString();
file_put_contents($tmpFilePath, $fileData);

// this just to help us get file info.
$tmpFile = new File($tmpFilePath);

$file = new UploadedFile(
    $tmpFile->getPathname(),
    $tmpFile->getFilename(),
    $tmpFile->getMimeType(),
    0,
    true // Mark it as test, since the file isn't from real HTTP POST.
);

$file->store('avatars');
Run Code Online (Sandbox Code Playgroud)

更新

由于您使用的是vue-image-upload-resize,我查看了它内置函数的文档以将输出从 base64 更改为 blob,因此您只需:

<image-uploader
    ...
    output-format="blob"
    ... />
Run Code Online (Sandbox Code Playgroud)