Laravel格式错误的UTF-8字符,可能使用图像干预错误编码



我有一个上传图像的拉拉维尔项目。我使用图像干预库进行上传。问题是我得到了一个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);
},        

问题似乎出现在你们这一代$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;

问题是这一行,我正在将实际的图像对象保存在数据库中。

$product->image = Image::make($request->image)->save(public_path('img/').$fileName);

我把它改成了

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

最新更新