2016-09-28 11 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) "storage/app/images/users/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

$ pathとは何ですか? – Mamulasa

+0

@Mamulasa Ohhごめんなさい、$ pathは、ディレクトリをアップロードするためのベースパスを文字列として格納する変数です。したがって、pathは$ path = base_path()にする必要があります。 '/ uploads/images /';私はすぐに私の答えを編集します。 –

0

いくつかの画像は、さまざまな理由でパブリックディレクトリに保存したくない場合があります。

画像の保存には多くの利点がありますが、

これを達成する方法はたくさんありますが、私はこの簡単な解決方法を持っています。

すでに1

<?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)}}"> 
関連する問題