Laravel 5.4错误:NotReadableException:图像源不可读

时间:2017-11-21 14:50:17

标签: laravel image-resizing intervention

我在创建个人资料时尝试创建不同大小的个人资料照片的多个副本。但我经常遇到这个错误:

" NotReadableException:图像源不可读"

有人能指出我在以下代码中遗漏的内容:

public function updateprofile(UserProfileRequest $request){
    $user_id = Auth::User()->id;
    $profile = UserProfile::where('user_id','=',$user_id)->first();
    $profile->fullname = $request->fullname;

    if ($request->hasFile('img')) {
        if($request->file('img')->isValid()) {
            $types = array('_original.', '_32.', '_64.', '_128.');
            $sizes = array( '32', '64', '128');
            $targetPath = 'public/uploads/'.$user_id;

            try {
                $file = $request->file('img');
                $ext = $file->getClientOriginalExtension();
                $fName = time();
                $original = $fName . array_shift($types) . $ext;
                Storage::putFileAs($targetPath, $file, $original);

                foreach ($types as $key => $type) {
                    $newName = $fName . $type . $ext;
                    Storage::copy($targetPath . $original, $targetPath . $newName);
                    $newImg = Image::make($targetPath . $newName);
                    $newImg->resize($sizes[$key], null, function($constraint){
                        $constraint->aspectRatio();
                    });
                    $newImg->save($targetPath . $newName);
                }

                $profile->img = 'public/uploads/'.$user_id;
            } catch (Illuminate\Filesystem\FileNotFoundException $e) {
            }
        }
    }

    $profile->save();}

3 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,我运行了该命令,它起作用了

php artisan storage:link

此命令在公用文件夹下创建一个存储目录。

还使用公共路径功能获取公共路径

$targetPath = public_path('storage/uploads/'. $user_id);

laravel public_path()函数内部使用的“存储”用于获取存储主文件夹。

答案 1 :(得分:0)

如果我没弄错,提供的路径应该是服务器上的绝对文件路径。例如,而不是:

$targetPath = 'public/uploads/'.$user_id;

使用(您的实际路径会因您的配置而异)

$targetPath = '/var/www/sitename/public/uploads/'.$user_id;

Laravel还包含一个名为public_path()的辅助函数,可用于获取公共目录的完全限定路径"。这将允许您使用如下内容:

$targetPath = public_path('uploads/'. $user_id);

此外,在此行中,不要忘记在新文件名前放置斜杠:

$newImg = Image::make($targetPath . '/' . $newName);

我还要确认执行脚本的用户(如果apache或nginx通常是www-data除非更改)对您的public/uploads/目录具有写权限

答案 2 :(得分:0)

最后,我得到了它的工作。我对我的代码进行了以下更改:

  1. 使用commanderZiltoid建议的完整操作系统路径作为目标路径。
  2. 请勿使用Storage::putFileAs方法保存文件。因此,请删除此行:Storage::putFileAs($targetPath, $file, $original);
  3. 请勿使用Storage::copy()复制文件,因此请删除此行: Storage::copy($targetPath . $original, $targetPath . $newName);
  4. 对于第2点和第3点,使用Image::make($file->getRealPath());这将创建文件并记住创建文件的路径。 Image->resize方法稍后将使用此路径。
  5. 最后,保存数据库中的相对路径,如下所示:$profile->img = 'storage/uploads/'.$user_id.'/img/profile/'.$fName。由于我们将使用{{ asset($profile->img) }},因此必须仅保存相对路径而不是绝对OS路径。

    if($request->hasFile('img')) {
    
        if($request->file('img')->isValid()) {
    
            $types = array('_original.', '_32.', '_64.', '_128.'); 
    
            $sizes = array( array('32','32'), array('64','64'), array('128','128'));
            $targetPath = '/Users/apple/Documents/_chayyo/chayyo/storage/app/public/uploads/'.$user_id.'/img/profile/';
    
        try {
            $file = $request->file('img');
            $ext = $file->getClientOriginalExtension();
            $fName = time();
            $o_name = $fName . array_shift($types) . $ext;
            $original = Image::make($file->getRealPath());
            $original->save($targetPath . $o_name);
    
            foreach ($types as $key => $type) {
                $newName = $fName . $type . $ext;
                $newImg = Image::make($file->getRealPath());
                $newImg->resize($sizes[$key][0], $sizes[$key][1]);
                $newImg->save($targetPath . $newName);
            }
    
            $profile->img = 'storage/uploads/'.$user_id.'/img/profile/'.$fName;
    
        } 
         catch (Illuminate\Filesystem\FileNotFoundException $e) {
    
        }
      }
    }