我有一个函数,它接收提交的表单数据,这是一个图像,然后验证它并删除旧图像(如果已存在)。它目前正在执行此操作并将图像存储在存储文件夹中。
我现在正在尝试将图像的URL保存到数据库中。我看过他们没有保存数据库路径的例子,但最好这样做吗?
这是我的功能
public function postAvatarUpload(Request $request)
{
$this->validate($request, [
'image' => 'required|image|max:3000|mimes:jpeg,jpg,bmp,png',
]);
$user = Auth::user();
$usersname = $user->username;
$file = $request->file('image');
$filename = $usersname . '.jpg';
if (Storage::disk('local')->has($filename)) {
Storage::delete($filename);
}
Storage::disk('local')->put($filename, File::get($file));
$avatarPath = Storage::url($filename);
Auth::user()->update([
'image' => $avatarPath,
]);
return redirect()->route('profile.index',
['username' => Auth::user()->username]);
}
答案 0 :(得分:1)
我主要将人们上传的图片存储到Laravel公共文件夹中的子文件夹中。然后只需要您的网络服务器完成工作就可以请求图像,而不必通过PHP提供服务。
对于像头像这样的图像,我根据模型名称和模型ID创建文件夹结构。喜欢:laravel_folder / public / images / user / 13 / avatar.jpg。
由于路径和网址基于modelname和id,因此您可以轻松生成直接网址和路径。缺点是其他用户的头像和路径是可预测的,所以不要将它用于敏感图像。
我看到你接受多种格式的图像(jpg,png,bmp)。 保存图像时,将其另存为jpg图像。您应该使用像Intervention这样的图像处理库,或者使用pathinfo($ file,PATHINFO_EXTENSION)获取文件的扩展名,否则文件将无法读取,因为图像扩展名和图像内容不匹配
还要考虑图像大小。用户可以上传海报大小的图像,而您只需要一个小图像。使用图像处理库创建原始图像的较小版本图像。
如果以用户提供的格式保存原始图像,则只需检查所有扩展名是否存在。一种方法是:
$extensions = [ 'jpg', 'jpeg', 'png', 'bmp' ];
$user = Auth::user();
$imagePath = "{public_path()}/images/{class_basename($user)}/{$user->id}/";
$imageName = "avatar";
// go through all extensions and remove image if it exists
foreach($extensions as $ext)
{
$imageFullPath = "{$imagePath}/{$imageName}.{$ext}";
if( file_exists($imageFullPath) )
{
@unlink($imageFullPath);
break;
}
}
答案 1 :(得分:0)
您在文件路径中存储的越少越好,因为您没有被锁定到任何文件夹结构。
现在您可以将所有上传内容存储在/ public / uploads中,但是当您的应用变大时,您可能希望将所有内容放在/ public / uploads / form_xyz_images中。当您将整个图像路径放在数据库中时,您必须调整数据库中的所有值。
更好的方法是仅保存文件名并将路径附加到其他位置。例如,您可以使用访问器和更改器来获取路径:https://laravel.com/docs/master/eloquent-mutators#accessors-and-mutators