2016-04-14 178 views
0

我有一個函數,它接受作爲圖像提交的表單數據,然後驗證它並刪除舊圖像(如果已存在)。它目前這樣做並將圖像存儲在存儲文件夾中。使用Laravel將圖像路徑保存到數據庫

我現在試圖將圖像的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]); 
    } 

回答

1

我主要將圖片上傳到Laravel公用文件夾中的子文件夾中。然後可以僅通過您的網絡服務器完成該工作而不需要通過PHP提供圖像。

對於像一個化身創建基於模型的型號名稱和編號的文件夾結構圖像。像:laravel_folder/public/images/user/13/avatar.jpg。

由於路徑和URL是基於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; 
    } 
} 
+0

謝謝,我只是增加了干預,現在,我要保存所有的不同的文件類型是有一種簡單的方法來檢查,如果用戶的用戶名的文件時,無論擴展的存儲?所以我可以刪除一箇舊的PNG,例如,如果他們上傳一個JPG – Joey93

0

你在你的文件路徑保存好,因爲你沒有鎖定任何folderstructure越少。

現在你可能您上傳的所有存儲在/公/上傳但是當你的應用程序變得更大,你可能想要把一切都放在/公/上傳/ form_xyz_images。將整個圖像路徑放入數據庫時​​,必須調整數據庫中的所有值。

一個更好的辦法是隻保存文件名並追加路徑別的地方。例如,您可以使用訪問器和增變器來獲取路徑:https://laravel.com/docs/master/eloquent-mutators#accessors-and-mutators

相關問題