我在创建个人资料时尝试创建不同大小的个人资料照片的多个副本。但我经常遇到这个错误:
" 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();}
答案 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)
最后,我得到了它的工作。我对我的代码进行了以下更改:
Storage::putFileAs
方法保存文件。因此,请删除此行:Storage::putFileAs($targetPath, $file, $original);
Storage::copy()
复制文件,因此请删除此行:
Storage::copy($targetPath . $original, $targetPath . $newName);
Image::make($file->getRealPath());
这将创建文件并记住创建文件的路径。 Image->resize
方法稍后将使用此路径。最后,保存数据库中的相对路径,如下所示:$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) {
}
}
}