Laravel 5.4 Error: NotReadableException: Image source not readable

Laravel 5.4 Error: NotReadableException: Image source not readable

我正在尝试在创建个人资料时创建多个不同尺寸的个人资料图片副本。但是我经常收到这个错误:

" 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();}

如果我没记错的话,提供的路径应该是你服务器上的绝对文件路径。例如代替:

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

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

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

Laravel 还包含一个名为 public_path() 的辅助函数,可用于获取 "fully qualified path to the public directory"。这将允许您使用诸如:

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

此外,在这一行中,不要忘记在新文件名前加上斜杠:

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

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

的写入权限

终于,我成功了。我对我的代码进行了以下更改:

  1. 使用 commanderZiltoid 建议的完整 OS 路径作为目标路径。
  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) {
    
        }
      }
    }
    

我在 运行 这个命令中遇到了同样的问题并且有效

php artisan storage:link

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

同样使用public路径函数得到public路径

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

laravelpublic_path()函数内部使用的'storage'用于获取存储主文件夹