Laravel 5 json响应图像路径未存储在mysql数据库中

时间:2017-12-24 08:30:43

标签: laravel laravel-5 laravel-5.3

我正在使用mysql将base64图像以及一些表格数据从邮递员发送到laravel 5。代码运行良好并返回成功json。来自json的所有值都存储在mysql中,但json图像路径不存储在数据库中,而是一些代码存储在数据库中。

我在postman中的实际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);
}

实际上我错过了什么......

2 个答案:

答案 0 :(得分:1)

这是因为你保存了这样的记录:

$user = News::create($input); 

所以你不要将$imgfile保存在数据库中。

您可以添加:

$success['img']  =  $imgfile;

更新记录的以下行

$user->update(['img' => $imgfile]);

或者您可以更改代码的顺序,以便稍后使用有效的News字段创建img记录。

另请注意,您使用的是错误的变量名称。拥有$user模型的News变量是没有意义的。

答案 1 :(得分:1)

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

}