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',
        ]);
    }

}