2016-09-28 98 views
2

我需要將圖像存儲在登錄用戶的後端。存儲的圖像需要受到保護,並且從外部(公共)不可見。我爲此選擇了一個「存儲」文件夾。Laravel訪問公用文件夾外的圖像

我在我的控制器想出了這一點:

public function update(Request $request, $id) 
{ 

    //Show the image 
    echo '<img src="'.$_POST['img_val'].'" />'; 

    //Get the base-64 string from data 
    $filteredData=substr($_POST['img_val'], strpos($_POST['img_val'], ",")+1); 

    //Decode the string 
    $unencodedData=base64_decode($filteredData); 

    //Save the image 
    $storagepath = storage_path('app/images/users/' . Auth::user()->id); 
    $imgoutput = file_put_contents($storagepath.'/flyer.png', $unencodedData); 

    return view('backend.flyers.index')->withImgoutput($imgoutput) 
            //->withStoragepath($storagepath); 

} 

擊中保存按鈕,觸發更新()我可以看到在我看來,圖像,它也存儲在後我文件夾(當前用戶= 10)「存儲/應用程序/圖像/用戶/ 10/flyer.png」

我的問題是我如何訪問圖像路徑? 我想用img src =「」>顯示存儲的圖像。我不知道該怎麼把裏面的 「SRC = ...」

+0

你確定你通過任何基本的PHP/Laravel去讀數? –

+0

這沒有幫助 – Mamulasa

+0

實際上,您正在使用Laravel中不存在的函數。你的代碼顯示缺乏信息。我真的會建議在通過一個新的應用程序之前通過一些PHP和Laravel的閱讀材料。 –

回答

0

你可以做到這一點是這樣的:

Route::get('images/{filename}', function ($filename) 
{ 
    $path = storage_path() . '/' . $filename; 

    if(!File::exists($path)) abort(404); 

    $file = File::get($path); 
    $type = File::mimeType($path); 

    $response = Response::make($file, 200); 
    $response->header("Content-Type", $type); 

    return $response; 
}); 

參考:

Laravel 5 - How to access image uploaded in storage within View?

或者您可以使用此庫:https://github.com/thephpleague/glide

只需使用作曲家將其安裝在您的項目中

默認情況下,這將渲染圖像從您的存儲,並允許你做各種事情與它如裁剪,色彩校正等

參考:

http://glide.thephpleague.com/

https://laracasts.com/discuss/channels/laravel/laravel-5-how-can-we-access-image-from-storage?page=1

2

在處理Web應用程序中的用戶文件上傳時,主要方面是關於用戶內容的安全性。 應該使用安全的方式在Web應用程序中上傳用戶的私人文件。

與你的情況一樣,你想訪問公用文件夾外的用戶圖像。 這可以通過下面給出的最安全的方式完成。

首先在Laravel的根目錄(公用文件夾所在的位置)創建一個目錄,讓該目錄的名稱爲uploads。使用此目錄上傳私人用戶文件。

在圖像的情況下,在上傳目錄中創建另一個上傳目錄作爲uploads/images/,這樣您可以針對不同類型的文件擁有不同的存儲位置。

請記住上傳圖片目錄中的圖片時使用不同的名稱並且沒有它們的擴展名,這樣看起來就像一個擴展名較少的文件。 將文件名及其擴展名保留在數據庫中,稍後可以使用它來保留圖像的位置。

現在你需要創建一個單獨的路徑來顯示用戶的圖像。

Route::get('users/{id}/profile_photo', '[email protected]')->name('users.showProfilePhoto'); 

PhotosController。PHP

class PhotosController extends Controller { 

    private $image_cache_expires = "Sat, 01 Jan 2050 00:00:00 GMT"; 
    public function showProfilePhoto($id) { 
     $user = User::find($id); 
     $path = base_path() . '/uploads/images/'; 

     if($user && $user->photo) // Column where user's photo name is stored in DB 
     { 
     $photo_path = $path . $user->photo; // eg: "file_name" 
     $photo_mime_type = $user->photo_mime_type; // eg: "image/jpeg" 
     $response = response()->make(File::get($photo_path)); 
     $response->header("Content-Type", $photo_mime_type); 
     $response->header("Expires", $this->image_cache_expires); 
     return $response; 
     } 
     abort("404"); 
    } 

} 

內PhotosController上面的方法 - users.showProfilePhoto - showProfilePhoto($user_id)將盡快訪問指定的路線行駛。

您的HTML代碼將如下所示。

<img src="<?php echo route('users.showProfilePhoto', array('id' => $user->id)); ?>" alt="Alter Text Here"> 

上面的代碼將像魅力一樣工作,圖像將顯示給用戶,而無需向公衆公佈正確的圖像路徑。 據我所知,這是處理Web應用程序中文件上傳的安全方式。

+0

$路徑代表什麼? – Mamulasa

+0

@Mamulasa哦,對不起,這是我的不好,$路徑是一個變量,存儲基本路徑上傳目錄作爲一個字符串。所以路徑應該是$ path = base_path()。 '/上傳/圖像/';我很快會編輯我的答案。 –

0

有時,您可能因爲某些原因不想將某些圖像存儲在公共目錄中。

雖然存儲您的圖像有很多好處。

有很多方法可以實現這一點,但我有這個簡單的解決方案。

你應該創建像這樣一個輔助類,如果已經沒有一個

<?php namespace App\Services; 

class Helper 
{ 
    public function imageToBase64($path) 
    { 
     $type = pathinfo($path, PATHINFO_EXTENSION); 
     $data = file_get_contents($path); 
     return 'data:image/' . $type . ';base64,' . base64_encode($data); 
    } 
} 

然後在您的視圖(刀片)

@inject('helper', 'App\Services\Helper') 

<img width="200" height="250" src="{{$helper->imageToBase64(storage_path('app/images/users/' . Auth::user()->id)}}"> 
相關問題