web-dev-qa-db-ja.com

Laravelリーグ/フライシステムがAWS S3でファイルURLを取得

Laravelリーグ/フライシステムに基づく: https://github.com/thephpleague/flysystem でファイル管理システムを構築しようとしています

私はS3アダプターを使用しており、アップロードしたファイルを保存するためにそれを使用しています:

$filesystem->write('filename.txt', 'contents');

S3アダプタを使用しているときに、ダウンロードファイルURLの生成で立ち往生しています。

ファイルはS3バケットに正しく保存されています。ファイルにアクセスする権限があり、league/flysystemパッケージを介してS3 getObjectUrlメソッドにアクセスする方法がわかりません。

私が試してみました:

$contents = $filesystem->read('filename.txt');

しかし、それはファイルの内容を返します。

$contents = $filemanager->listContents();

または

$paths = $filemanager->listPaths();

しかし、それらは私に私のファイルへの相対パスを与えます。

「ht ... // [s3-region] .amazonaws.com/[bucket]/[dir]/[file] ...」のようなものが必要です

16
Ioana Cucuruzan

正しいこれを行う方法がFlysystemで何であるかはわかりませんが、基礎となる_S3Client_オブジェクトにはそのためのメソッドがあります。 $filesystem->getAdapter()->getClient()->getObjectUrl($bucket, $key);を実行できます。もちろん、URLの作成は説明したとおり簡単です。そのため、特別なメソッドは必要ありません。

12
Jeremy Lindblom

私はLaravel 5.2を使用しており、以下のコードは正常に機能しているようです。

Storage::cloud()->url('filename');
28
i906

Laravel 5.1に更新する場合、このメソッドはアダプターでサポートされなくなりました。構成でS3_REGIONを設定する必要があります。そうしないと、無効なホスト名エラーが発生します。次に、次のようにコマンドを使用する必要がありました。 presignedRequestを作成するための入力。

    public function getFilePathAttribute($value)
{

    $disk = Storage::disk('s3');
    if ($disk->exists($value)) {
        $command = $disk->getDriver()->getAdapter()->getClient()->getCommand('GetObject', [
            'Bucket'                     => Config::get('filesystems.disks.s3.bucket'),
            'Key'                        => $value,
            'ResponseContentDisposition' => 'attachment;'
        ]);

        $request = $disk->getDriver()->getAdapter()->getClient()->createPresignedRequest($command, '+5 minutes');

        return (string) $request->getUri();
    }

    return $value;
}
10
Richard McLain

多分私はこの質問に少し遅れていますが、ここにLaravel 5の組み込みファイルシステムを使用する方法があります。

LaravelのFilesystemManagerを拡張して、パブリックURLの取得を処理するManagerクラスを作成しました。

class FilesystemPublicUrlManager extends FilesystemManager
{

    public function publicUrl($name = null, $object_path = '')
    {
        $name = $name ?: $this->getDefaultDriver();
        $config = $this->getConfig($name);

        return $this->{'get' . ucfirst($config['driver']) . 'PublicUrl'}($config, $object_path);
    }

    public function getLocalPublicUrl($config, $object_path = '')
    {
        return URL::to('/public') . $object_path;
    }

    public function getS3PublicUrl($config, $object_path = '')
    {
        $config += ['version' => 'latest'];

        if ($config['key'] && $config['secret']) {
            $config['credentials'] = Arr::only($config, ['key', 'secret']);
        }

        return (new S3Client($config))->getObjectUrl($config['bucket'], $object_path);
    }
}

次に、このクラスをregisterメソッドの下のAppServiceProviderに追加して、現在のアプリインスタンスにアクセスできるようにします。

$this->app->singleton('filesystemPublicUrl', function () {
    return new FilesystemPublicUrlManager($this->app);
});

最後に、簡単な静的アクセスのために、Facadeクラスを作成しました。

use Illuminate\Support\Facades\Facade;

class StorageUrl extends Facade
{

    /**
     * Get the registered name of the component.
     *
     * @return string
     */
    protected static function getFacadeAccessor()
    {
        return 'filesystemPublicUrl';
    }
}

これで、ローカルファイルシステムとs3ファイルシステムのパブリックオブジェクトのパブリックURLを簡単に取得できます(FilesystemPublicUrlManagerでftpまたはrackspaceに何も追加していないことに注意してください)。

$s3Url = StorageUrl::publicUrl('s3') //using the s3 driver
$localUrl = StorageUrl::publicUrl('local') //using the local driver
$defaultUrl = StorageUrl::publicUrl() //default driver
$objectUrl = StorageUrl::publicUrl('s3', '/path/to/object');
6
Kevin Lee

Storage :: cloud()の別の形式:

    /** @var FilesystemAdapter $disk */
    $s3 = Storage::disk('s3');
    return $s3->url($path);
0
Greg