92

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

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

4

13 に答える 13

60

編集: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 のドキュメントにはこの方法については言及されていませんが、詳細を知りたい場合は、こちらのソース コードを確認してください。

于 2016-04-05T15:24:11.173 に答える
9

これが私がそれを機能させる方法です-環境変数を使用して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('/');
}
于 2015-03-16T00:25:13.337 に答える
8

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

Storage::disk('local')->url('screenshots/1.jpg'); // storage/screenshots/1.jpg
Storage::disk('local')->url(''): // storage

また、興味があれば、Eloquent モデル フィールドでこれらすべてのフィールドを使用できるように、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();
于 2017-08-02T13:28:46.583 に答える
5

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

$file_path = \Storage::url($filename);
$url = asset($file_path);
// Output: http://example.com/storage/filename.jpg
于 2017-09-26T10:03:08.530 に答える
4

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

$url = Storage::disk('public')->url($filename);
$path = public_path($url);
于 2016-07-26T06:49:32.540 に答える
3

さて、数週間前、私は非常によく似た質問をしました (ストレージを介してアップロードされたファイルから CDN url を取得します): CDN url でビューに画像を表示したかった (必要に応じて)。

ただし、パッケージ API を確認した後、このタスクを実行する方法がないことを確認しました。したがって、私の解決策は使用を避けることflysystemでした。私の場合、RackSpace で遊ぶ必要がありました。そこで、最終的に、使用パッケージを作成し、 OpenStack 用の PHP SDK を使用して独自のストレージ パッケージを作成することにしました。

getPublicUrl()このようにして、cdn コンテナーからパブリック URL を取得するために必要な機能に完全にアクセスできます。

/** @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のソリューションを試すことができます

于 2015-03-10T17:31:19.290 に答える
2

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

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

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

于 2019-02-19T10:48:15.963 に答える