web-dev-qa-db-ja.com

laravel 5のストレージファサードを使用してファイルパスを取得する方法

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') }}" />

しかし、パス、または完全なパスを取得できるものは使用できません(私の知る限り)。では、どうすればフルパスを返すことができますか?または、これが仕様によるものかどうか疑問に思っていますか?もしそうなら、なぜ私は完全なパスを取得することになっていないのですか?または、私はこれについて完全に間違った方法で行っていますか?

60
daviestar

編集: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

41
pj.martorell

ストレージディスクへのパスは次のようになります。

$storagePath  = Storage::disk('local')->getDriver()->getAdapter()->getPathPrefix()

私はそれに対する短い解決策を知りません...

ビューに$ storagePathを共有してから、単に呼び出すことができます

$storagePath."/myImg.jpg";
129
shock_gone_wild

このメソッドはLaravel 5.4以降に存在し、次の方法で取得できます。

$path = Storage::disk('public')->path($filename);
37
Bilal Gultekin

これが私がそれを機能させる方法です-環境変数を使用して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('/');
}
8
daviestar

以下のように、最初にファイルのURL /リンクを取得し、次にパスを取得します。

$url = Storage::disk('public')->url($filename);
$path = public_path($url);
3
muzk6

さて、数週間前に非常に似た質問をしました( ストレージ経由でアップロードされたファイルから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のソリューションを試すことができます

3
manix

ファイルの絶対URLが必要な場合は、以下のコードを使用します。

$file_path = \Storage::url($filename);
$url = asset($file_path);
// Output: http://example.com/storage/filename.jpg
2
Arvind Bhardwaj

保管方法:

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"/>
2
MevlütÖzdemir

ストレージ(ディスク)パスを表示するだけの場合は、これを使用します。

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();
2
fsasvari

私の場合、ローカルファイル用に別のメソッドを作成しました。このファイルでは、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 誰かがこれをマージする可能性があります))

1
Ruslan Terekhov

私が見つけた別の解決策はこれです:

Storage::disk('documents')->getDriver()->getConfig()->get('url')

ドキュメントストレージのベースパスを含むURLを返します

1
Marc Garcia

これを見てください: storage_path()を使用してlaravel 4のイメージを表示する方法 同じことがLaravel 5にも当てはまります。

ストレージはファイルシステム用であり、その大部分はWebサーバーからアクセスできません。推奨される解決策は、パブリックフォルダ(ドキュメントルート)のどこかに、たとえばpublic/screenshots/などのイメージを保存することです。次に、それらを表示する場合は、asset('screenshots/1.jpg')を使用します。

1
nXu