首页 > 解决方案 > Laravel 格式错误的 UTF-8 字符,可能使用图像干预错误编码

问题描述

我有一个上传图片的 laravel 项目。我使用图像干预库进行上传。问题是我有一个500错误并说Malformed UTF-8 characters, possibly incorrectly encoded。但是当我查看要保存的目录时,图像已保存,但数据未保存到数据库中。只保存了图像。似乎图像保存成功,但请求未成功。似乎是什么问题?

控制器

 public function store(Request $request)
    {
        $product = new Product;
        $validator = \Validator::make($request->all(), [
            'product_name' => 'required',
            'barcode' => 'required|unique:products',
            'price'=> 'required',
            'category' => 'required',
            'supplier' => 'required',
            // 'image' => 'required|image64:jpeg,jpg,png'
        ]);

        if ($validator->fails()) {
            $errors = json_encode($validator->errors());
            return response()->json([
                'success' => false,
                'message' => $errors
            ],422);
        } else {
            $product->barcode = $request->barcode;
            $product->product_name = $request->product_name;
            $product->price = $request->price;
            $product->quantity = 0;
            $product->category = $request->category;
            $product->supplier_id = $request->supplier;

            //image
            $imageData = $request->image;
            $fileName = time().'.'. explode('/', explode(':', substr($imageData, 0, strpos($imageData, ';'))) [1])[1];
            $product->image = \Image::make($request->image)->save(public_path('img/').$fileName);

            $product->save();

            broadcast(new ProductsEvent(\Auth::user()->name, 'add', $product))->toOthers();
        }
    }

表单更改时的Vue组件事件

  onFileChange(e) {
                let file = e.target.files[0];
                console.log(file);
                var reader = new FileReader();
                reader.onloadend = (file)=>{this.image = reader.result}
                reader.readAsDataURL(file);
            },        

标签: phplaravelimagefile-upload

解决方案


看来问题出现在你们$filename这一代。

只要您保存了正确的图像,命名约定就在您手中。

我建议您使用更简单的方法,例如 $fileName = now()->timestamp . '_' . $imageData->name;,您无需花哨的文件名。

的值$imageData无法预测,您执行的所有操作都可能导致该问题。

Laravel已经问过这个问题“格式错误的 UTF-8 字符,可能编码不正确”,如何解决?

- - 编辑 - -

您可以直接从您的 javascript 中获取文件名,因为您在那端进行所有操作,因此您可以例如添加this.name = file.name;到您发送的数据中,然后在您的 ajax 中您可以像这样发送该数据 -

axios.post('/image/store',{
    image: this.image,
    imageName: this.name
}).then(response => {...});

在你的后端$fileName = now()->timestamp . '_' . $request->imageName;


推荐阅读