使用Laravel将图像路径保存到数据库

时间:2016-04-14 10:37:49

标签: php laravel laravel-5.2

我有一个函数,它接收提交的表单数据,这是一个图像,然后验证它并删除旧图像(如果已存在)。它目前正在执行此操作并将图像存储在存储文件夹中。

我现在正在尝试将图像的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]);
    }

2 个答案:

答案 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