回答:
最善のアプローチは、作成することですシンボリックリンク非常によくで指摘@SlateEntropyなどを下記の答え。これを助けるために、バージョン5.3以降、Laravelにはこれを信じられないほど簡単にするコマンドが含まれています。
php artisan storage:link
これで、からのシンボリックリンクが作成public/storage
さstorage/app/public
れます。これで、次の/storage/app/public
ようなリンクを介してすべてのファイルにアクセスできます。
http://somedomain.com/storage/image.jpg
何らかの理由でシンボリックリンクを作成できない場合(共有ホスティングを使用している場合など)、または一部のアクセス制御ロジックの背後にあるファイルを保護する場合は、読み取りと読み取りを行う特別なルートを使用する方法があります。画像を提供します。たとえば、次のような単純な閉鎖ルート:
Route::get('storage/{filename}', function ($filename)
{
$path = storage_path('public/' . $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;
});
これで、シンボリックリンクがある場合と同じようにファイルにアクセスできます。
http://somedomain.com/storage/image.jpg
あなたが使用している場合は介入イメージライブラリを、あなたはその中に組み込まれて使用することができますresponse
物事をより簡潔にする方法を:
Route::get('storage/{filename}', function ($filename)
{
return Image::make(storage_path('public/' . $filename))->response();
});
警告
であることに留意してください手動で提供するファイルをあなたが負担しているパフォーマンスの低下をあなたが読んでいるファイルの内容を、送信するために、全体Laravel要求のライフサイクルを通過しているので、かなり遅い HTTPサーバハンドルを持つよりを。
public
ディレクトリに保存した方がよいと思います。このようにして、HTTPサーバーでより高速に処理できる画像応答を作成する必要があるというオーバーヘッドを回避します。
1つのオプションは、ストレージディレクトリのサブフォルダーとパブリックディレクトリの間にシンボリックリンクを作成することです。
例えば
ln -s /path/to/laravel/storage/avatars /path/to/laravel/public/avatars
これは、Laravelの開発者であるTaylor Otwellによって構築されたデプロイメントマネージャであるEnvoyerでも使用されている方法です。
storage
一般公開で保存されているユーザーのアバターを表示する方法を尋ねた質問です。通常、アバターはなんらかのアクセス制御を必要としません。何らかのミドルウェアまたはルートを使用してセキュリティが必要ない場合、リソースへの無駄な打撃にすぎません。Laravel 5.2以降では、シンボリックリンクを使用してパブリックファイル(laravel.com/docs/5.2/filesystem)に個別のファイル「ディスク」が存在するため、注目に値します。
Laravel 5.2のドキュメントによると、公開されているファイルはディレクトリに置く必要があります
storage/app/public
Webからアクセスできるようにするには、からpublic/storage
へのシンボリックリンクを作成する必要がありますstorage/app/public
。
ln -s /path/to/laravel/storage/app/public /path/to/laravel/public/storage
これで、アセットヘルパーを使用して、ビューにファイルへのURLを作成できます。
echo asset('storage/file.txt');
Windowsを使用している場合は、cmdで次のコマンドを実行できます。
mklink /j /path/to/laravel/public/avatars /path/to/laravel/storage/avatars
から:http : //www.sevenforums.com/tutorials/278262-mklink-create-use-links-windows.html
すべてのプライベートイメージとドキュメントをストレージディレクトリに保存すると、特定のタイプのユーザーがファイルにアクセスしたり制限したりできるように、ファイルエーテルを完全に制御できるようになります。
ルート/ドキュメントを作成し、任意のコントローラーメソッドをポイントします。
public function docs() {
//custom logic
//check if user is logged in or user have permission to download this file etc
return response()->download(
storage_path('app/users/documents/4YPa0bl0L01ey2jO2CTVzlfuBcrNyHE2TV8xakPk.png'),
'filename.png',
['Content-Type' => 'image/png']
);
}
あなたがヒットするとき、localhost:8000/docs
ファイルが存在する場合はダウンロードされます。
ファイルはroot/storage/app/users/documents
上記のコードに従ってディレクトリにある必要がありますLaravel 5.4
。これはでテストされました。
少数のプライベートイメージをロードする場合は、イメージをbase64にエンコードして、<img src="{{$image_data}}">
直接エコーすることができます。
$path = image.png
$full_path = Storage::path($path);
$base64 = base64_encode(Storage::get($path));
$image_data = 'data:'.mime_content_type($full_path) . ';base64,' . $base64;
これらのメソッドを使用するのは、urlを介してパブリックにアクセスできるようにしたくない場合にのみ使用する必要があるためです。代わりに、常に標準の方法を使用する必要があります(リンクストレージ/パブリックフォルダーを使用して、HTTPサーバーでイメージを提供する)。
エンコーディングにbase64()
は2つの重要な欠点があることに注意してください。
サイト名なし
{{Storage::url($photoLink)}}
サイト名を追加してAPI JSON felidsに追加する例
public function getPhotoFullLinkAttribute()
{
return env('APP_URL', false).Storage::url($this->attributes['avatar']) ;
}
あなたが私のようなもので、どういうわけか完全なファイルパスがあり(必要な写真でglob()パターンマッチングを行ったので、ファイルの完全なパスがほとんどになる)、ストレージ設定は適切にリンクされている(つまり、パスが文字列storage/app/public/
)があれば、以下の小さな汚いハックを使用できます:p)
public static function hackoutFileFromStorageFolder($fullfilePath) {
if (strpos($fullfilePath, 'storage/app/public/')) {
$fileParts = explode('storage/app/public/', $fullfilePath);
if( count($fileParts) > 1){
return $fileParts[1];
}
}
return '';
}
ディスク「ローカル」が機能していない場合は、これを試してください:
'default' => env('FILESYSTEM_DRIVER', 'public'),
からproject_folder/config/filesystem.php
php artisan config:clear
php artisan storage:link
アップロードされた画像のURLを取得するには、これを使用できます Storage::url('iamge_name.jpg');