Laravel 5 json 响应图像路径未存储在 mysql 数据库中
Laravel 5 json response image path is not stored in mysql database
我正在使用 mysql 将 base64 图像连同一些表单数据从邮递员发送到 laravel 5。该代码运行良好,returns 也成功 json。 json 中的所有值都存储在 mysql 中,但 json 图像路径未存储在数据库中,而是一些代码存储在数据库中。
我在邮递员中的实际 json 回复是 =>
{"success":{"userid":"4","fname":"s","lname":"s","img":"uploads\/5a3f6218a1ed0.jpg"}}
以上所有json值都存储在数据库中,但img json路径未存储,而是将以下数据存储在数据库中。
/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9Pjv/2wBDAQoLCw4NDhwQEBw7KCIoOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs
我的 Laravel API 代码是
public function add(Request $request)
{
$validator = Validator::make($request->all(), [
'userid' => 'required',
'fname' => 'required',
'lname' => 'required',
'img' => 'required',
]);
if ($validator->fails()) {
return response()->json(['error'=>$validator->errors()], 401);
}
$input = $request->all();
$user = News::create($input);
$success['userid'] = $user->userid;
$success['fname'] = $user->fname;
$success['lname'] = $user->lname;
if ($user->img)
{
$img2 = $user->img;
$img3 = str_replace('data:image/jpg;base64,', '', $img2);
$img3 = str_replace(' ', '+', $img3);
$data = base64_decode($img3);
$file = 'uploads/' . uniqid() . '.jpg';
file_put_contents($file, $data);
$imgfile = $file;
$success['img'] = $imgfile;
}
return response()->json(['success'=>$success], $this->successStatus);
}
我到底错过了什么...
这是因为你这样保存记录:
$user = News::create($input);
所以你不在数据库中保存 $imgfile
。
您可以在后面添加:
$success['img'] = $imgfile;
下一行更新记录
$user->update(['img' => $imgfile]);
或者您可以更改代码的顺序,以便稍后使用有效的 img
字段创建 News
记录。
另请记住,您使用了错误的变量名。 $user
包含 News
模型的变量是没有意义的。
正如 Marcin 上面所述,这是因为您没有将 imgfile 保存到数据库中。
我还会考虑重构您的一些代码,使 add 方法不那么冗长。考虑类似以下代码块的内容。请注意,没有使用任何语句,也没有实现 try/catch。
我还发现,通常最好给出更完整的变量和 属性 名称。例如 fname 我会根据上下文调用 first_name/firstName。
<?php
class ApiController
{
/**
* Add news item
*
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function add(Request $request)
{
$validator = $this->validateData($request);
if ($validator->fails()) {
return response()->json(['error'=>$validator->errors()], 422);
}
$news = News::create($request->all());
if ($news) {
$success['userid'] = $news->userid;
$success['fname'] = $news->fname;
$success['lname'] = $news->lname;
$success['img'] = $this->uploadImage($news);
$news->update(['img' => $success['img']]);
return response()->json(['success'=>$success], $this->successStatus);
}
return response()->json(['error'=>'An Error occurred when creating the news item'], 422);
}
/**
* Upload Image and return file name
*
* @param $news
* @return string
*/
protected function uploadImage($news)
{
$image = $news->img;
$image = str_replace('data:image/jpg;base64,', '', $image);
$image = str_replace(' ', '+', $image);
$data = base64_decode($image);
$file = 'uploads/' . uniqid() . '.jpg';
file_put_contents($file, $data);
return $file;
}
/**
* Validate inbound request
*
* @param $request
*/
protected function validateData($request)
{
Validator::make($request->all(), [
'userid' => 'required',
'fname' => 'required',
'lname' => 'required',
'img' => 'required',
]);
}
}
我正在使用 mysql 将 base64 图像连同一些表单数据从邮递员发送到 laravel 5。该代码运行良好,returns 也成功 json。 json 中的所有值都存储在 mysql 中,但 json 图像路径未存储在数据库中,而是一些代码存储在数据库中。
我在邮递员中的实际 json 回复是 =>
{"success":{"userid":"4","fname":"s","lname":"s","img":"uploads\/5a3f6218a1ed0.jpg"}}
以上所有json值都存储在数据库中,但img json路径未存储,而是将以下数据存储在数据库中。
/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9Pjv/2wBDAQoLCw4NDhwQEBw7KCIoOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs
我的 Laravel API 代码是
public function add(Request $request)
{
$validator = Validator::make($request->all(), [
'userid' => 'required',
'fname' => 'required',
'lname' => 'required',
'img' => 'required',
]);
if ($validator->fails()) {
return response()->json(['error'=>$validator->errors()], 401);
}
$input = $request->all();
$user = News::create($input);
$success['userid'] = $user->userid;
$success['fname'] = $user->fname;
$success['lname'] = $user->lname;
if ($user->img)
{
$img2 = $user->img;
$img3 = str_replace('data:image/jpg;base64,', '', $img2);
$img3 = str_replace(' ', '+', $img3);
$data = base64_decode($img3);
$file = 'uploads/' . uniqid() . '.jpg';
file_put_contents($file, $data);
$imgfile = $file;
$success['img'] = $imgfile;
}
return response()->json(['success'=>$success], $this->successStatus);
}
我到底错过了什么...
这是因为你这样保存记录:
$user = News::create($input);
所以你不在数据库中保存 $imgfile
。
您可以在后面添加:
$success['img'] = $imgfile;
下一行更新记录
$user->update(['img' => $imgfile]);
或者您可以更改代码的顺序,以便稍后使用有效的 img
字段创建 News
记录。
另请记住,您使用了错误的变量名。 $user
包含 News
模型的变量是没有意义的。
正如 Marcin 上面所述,这是因为您没有将 imgfile 保存到数据库中。
我还会考虑重构您的一些代码,使 add 方法不那么冗长。考虑类似以下代码块的内容。请注意,没有使用任何语句,也没有实现 try/catch。
我还发现,通常最好给出更完整的变量和 属性 名称。例如 fname 我会根据上下文调用 first_name/firstName。
<?php
class ApiController
{
/**
* Add news item
*
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function add(Request $request)
{
$validator = $this->validateData($request);
if ($validator->fails()) {
return response()->json(['error'=>$validator->errors()], 422);
}
$news = News::create($request->all());
if ($news) {
$success['userid'] = $news->userid;
$success['fname'] = $news->fname;
$success['lname'] = $news->lname;
$success['img'] = $this->uploadImage($news);
$news->update(['img' => $success['img']]);
return response()->json(['success'=>$success], $this->successStatus);
}
return response()->json(['error'=>'An Error occurred when creating the news item'], 422);
}
/**
* Upload Image and return file name
*
* @param $news
* @return string
*/
protected function uploadImage($news)
{
$image = $news->img;
$image = str_replace('data:image/jpg;base64,', '', $image);
$image = str_replace(' ', '+', $image);
$data = base64_decode($image);
$file = 'uploads/' . uniqid() . '.jpg';
file_put_contents($file, $data);
return $file;
}
/**
* Validate inbound request
*
* @param $request
*/
protected function validateData($request)
{
Validator::make($request->all(), [
'userid' => 'required',
'fname' => 'required',
'lname' => 'required',
'img' => 'required',
]);
}
}