Laravel-将base64字符串转换为有效图像

时间:2018-11-13 19:31:42

标签: php laravel laravel-5

为了让您了解我要做什么,这是我当前的代码

当对特定URL发出发布请求时,将运行此代码

public function uploadImage(Request $request) {
    $request->file = base64_decode(explode(',', $request->file)[1]);

    $request->validate([
        'file' => 'image|required|mimes:jpg,png',
    ]);

    $image = $request->file('file');

    $complete = $image->getClientOriginalName();
    $name = pathinfo($complete, PATHINFO_FILENAME);
    $extension = $image->getClientOriginalExtension();
    $storageName = $name.'_'.time().'.'.$extension;

    Storage::disk('public')->put($storageName, File::get($image));

    return Storage::disk('public')->path($storageName);
}

第一行,我试图变得聪明,首先将base64解码为一个文件(如果我正确的话?)。

接下来是一个验证,用于验证请求中的file参数是否存在,是否是图像以及是.jpg还是.png

(接下来的几行仅是将“图像”保存到文件系统中)

但是验证不会通过,因为file参数不是图像。所以我的问题是:是否可以在Laravel中将base64字符串转换为有效图像?如果是这样,如何实现?

3 个答案:

答案 0 :(得分:0)

Laravel无法将base 64字符串解析为文件,因此文件验证器失败。您也将无法使用->file('file')访问数据,因为同样,您也没有通过有效的文件上传进行发送。

相反,您可以进行自己的简单字符串检查(可能是data:image的索引,或者最好是更广泛的索引,例如imagecreatefromstring)或调查writing a custom Laravel validation rule,然后保存发送的字符串放入file_put_contents的文件中。

如果您实际上要进行文件上传并将其转换为服务器端的base 64,则需要使用<input type="file">。从那里,您将能够使用内置的Laravel验证和文件存储功能。 Refer to this extensive guide.一旦获得文件,就可以使用base64_encodesee this answer for a more thorough guide)将其转换为base64。

我知道这个答案不是很具体,但是如果您确切说明您要做什么,我可以提供更多动手指导。

答案 1 :(得分:0)

  

您可以有效映像 base64
  请一步一步跟随我:

1。转到文件夹yourProjectName \ app \ Providers \ AppServiceProvider.php
2。复制此代码,并将其复制到此文件中的函数 boot()

Validator::extend('is_image', function ($attribute, $value, $parameters, $validator) {
        preg_match_all('/([^\.]+)\.([a-zA-Z]+)/',$value,$matchedExt);
        if (isset($matchedExt[2][0]) && in_array($matchedExt[2][0],$parameters)) return true;
        preg_match_all('/data\:image\/([a-zA-Z]+)\;base64/',$value,$matched);
        $ext = isset($matched[1][0]) ? $matched[1][0] : false;
        print_r($value);
        return in_array($ext,$parameters) ? true : false;
});
  1. 转到您的函数uploadImage()并跳过此代码
public function uploadImage(Request $request) {

    $request->validate([
        'file' => 'image|required|is_image:jpg,png',
    ]);

    $image = $request->file('file');

    $complete = $image->getClientOriginalName();
    $name = pathinfo($complete, PATHINFO_FILENAME);
    $extension = $image->getClientOriginalExtension();
    $storageName = $name.'_'.time().'.'.$extension;

    Storage::disk('public')->put($storageName, File::get($image));

    return Storage::disk('public')->path($storageName);
}

希望我能为您解决问题

答案 2 :(得分:0)

我正在使用此代码将base64字符串转换为图像:

    public function getImage($img, $pid)
{
    if($img == "")
        return null;
    $imagecode = base64_decode($img);

    $directory = public_path('img/uploads/x' . $pid);
    if (!file_exists($directory))
        \File::makeDirectory($directory);
    $id = uniqid('img_');
    $filename = time() . '-' . $id . '.png';
    $path = public_path('img/uploads/product_img/p' . $pid . '/' . $filename);
    $tpath = public_path('img/uploads/product_img/p' . $pid . '/small-' . $filename);

    try {
        $image = Image::make($imagecode)->widen(600, function ($constraint) {
            $constraint->upsize();
        })->save($path);
        $image->fit(200, 200)->save($tpath);
    } catch (Exception $e) {
        return null;
    }

    return "x" . $pid . "/" . $filename;
}