Laravel 5との新しいFlysystem統合を使用して実験しています。DBへの「ローカライズされた」パスを保存し、Storageファサードにパスを完成させています。たとえば、screenshots/1.jpg
を保存して
Storage::disk('local')->get('screenshots/1.jpg')
または
Storage::disk('s3')->get('screenshots/1.jpg')
別のディスクで同じファイルを取得できます。
get
はファイルの内容を取得しますが、次のようにビューで使用したいと考えています。
<img src="{{ Storage::path('screenshots/1.jpg') }}" />
しかし、パス、または完全なパスを取得できるものは使用できません(私の知る限り)。では、どうすればフルパスを返すことができますか?または、これが仕様によるものかどうか疑問に思っていますか?もしそうなら、なぜ私は完全なパスを取得することになっていないのですか?または、私はこれについて完全に間違った方法で行っていますか?
編集:L5.2 +のソリューション
より良い、より簡単な解決策があります。
Storage::url($filename)
を使用して、指定されたファイルの完全パス/ URLを取得します。 S3
のストレージファイルシステムとしてconfig/filesystems.php
を設定する必要があることに注意してください:'default' => 's3'
もちろん、同じ方法でStorage::disk('s3')->url($filename)
を実行することもできます。
config/filesystems.php
でわかるように、Cloudファイルシステムを参照するパラメーター'cloud' => 's3'
も定義されています。ローカルサーバーのストレージフォルダーを保持したいが、クラウド内のいくつかのファイルを取得/保存する場合は、Storage::cloud()
を使用します。これには、同じファイルシステムメソッド、つまりStorage::cloud()->url($filename)
もあります。
Laravelのドキュメントではこのメソッドについて言及されていませんが、詳細を知りたい場合は、そのソースコードを確認できます here 。
ストレージディスクへのパスは次のようになります。
$storagePath = Storage::disk('local')->getDriver()->getAdapter()->getPathPrefix()
私はそれに対する短い解決策を知りません...
ビューに$ storagePathを共有してから、単に呼び出すことができます
$storagePath."/myImg.jpg";
このメソッドはLaravel 5.4以降に存在し、次の方法で取得できます。
$path = Storage::disk('public')->path($filename);
これが私がそれを機能させる方法です-環境変数を使用してs3とローカルディレクトリパスを切り替え、すべてのビューにパスを渡します。
.envで:
APP_FILESYSTEM=local or s3
S3_BUCKET=BucketID
Config/filesystems.phpで:
'default' => env('APP_FILESYSTEM'),
App/Providers/AppServiceProviderで:
public function boot()
{
view()->share('dynamic_storage', $this->storagePath());
}
protected function storagePath()
{
if(Storage::getDefaultDriver() == 's3') {
return Storage::getDriver()
->getAdapter()
->getClient()
->getObjectUrl(env('S3_BUCKET'), '');
}
return URL::to('/');
}
以下のように、最初にファイルのURL /リンクを取得し、次にパスを取得します。
$url = Storage::disk('public')->url($filename);
$path = public_path($url);
さて、数週間前に非常に似た質問をしました( ストレージ経由でアップロードされたファイルからCDN urlを取得 ):CDN urlが私のビューに画像を表示することを望んでいました(あなたが要求しているように)。
ただし、パッケージAPIを確認した後、このタスクを実行する方法がないことを確認しました。したがって、私の解決策はflysystem
の使用を避けることでした。私の場合、RackSpaceで遊ぶ必要がありました。したがって、最終的に使用パッケージを作成し、 The OpenStack用PHP SDK を使用して独自のストレージパッケージを作成することにします。
この方法により、cdnコンテナからパブリックURLを取得するためにgetPublicUrl()
のような必要な関数にフルアクセスできます。
/** @var DataObject $file */
$file = \OpenCloud::container('cdn')->getObject('screenshots/1.jpg');
// $url: https://d224d291-8316ade.ssl.cf1.rackcdn.com/screenshots/1.jpg
$url = (string) $file->getPublicUrl(UrlType::SSL);
結論として、ストレージサービスを別のレベルに移行する必要がある場合、flysystem
では十分ではありません。 local
の目的で、@ nXuのソリューションを試すことができます
ファイルの絶対URLが必要な場合は、以下のコードを使用します。
$file_path = \Storage::url($filename);
$url = asset($file_path);
// Output: http://example.com/storage/filename.jpg
保管方法:
public function upload($img){
$filename = Carbon::now() . '-' . $img->getClientOriginalName();
return Storage::put($filename, File::get($img)) ? $filename : '';
}
ルート:
Route::get('image/{filename}', [
'as' => 'product.image',
'uses' => 'ProductController@getImage',
]);
コントローラ:
public function getImage($filename)
{
$file = Storage::get($filename);
return new Response($file, 200);
}
表示:
<img src="{{ route('product.image', ['filename' => $yourImageName]) }}" alt="your image"/>
ストレージ(ディスク)パスを表示するだけの場合は、これを使用します。
Storage::disk('local')->url('screenshots/1.jpg'); // storage/screenshots/1.jpg
Storage::disk('local')->url(''): // storage
また、興味がある場合は、Laravel専用のパッケージを作成しました( https://github.com/fsasvari/laravel-uploadify )説得力のあるモデルフィールド:
$car = Car::first();
$car->upload_cover_image->url();
$car->upload_cover_image->name();
$car->upload_cover_image->basename();
$car->upload_cover_image->extension();
$car->upload_cover_image->filesize();
私の場合、ローカルファイル用に別のメソッドを作成しました。このファイルでは、src/Illuminate/Filesystem/FilesystemAdapter.php
/**
* Get the local path for the given filename.
* @param $path
* @return string
*/
public function localPath($path)
{
$adapter = $this->driver->getAdapter();
if ($adapter instanceof LocalAdapter) {
return $adapter->getPathPrefix().$path;
} else {
throw new RuntimeException('This driver does not support retrieving local path');
}
}
次に、フレームワークへのプルリクエストを作成しますが、まだメインコアにマージされていません: https://github.com/laravel/framework/pull/13605 誰かがこれをマージする可能性があります))
私が見つけた別の解決策はこれです:
Storage::disk('documents')->getDriver()->getConfig()->get('url')
ドキュメントストレージのベースパスを含むURLを返します
これを見てください: storage_path()を使用してlaravel 4のイメージを表示する方法 同じことがLaravel 5にも当てはまります。
ストレージはファイルシステム用であり、その大部分はWebサーバーからアクセスできません。推奨される解決策は、パブリックフォルダ(ドキュメントルート)のどこかに、たとえばpublic/screenshots/
などのイメージを保存することです。次に、それらを表示する場合は、asset('screenshots/1.jpg')
を使用します。