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] ...」のようなものが必要です
正しいこれを行う方法がFlysystemで何であるかはわかりませんが、基礎となる_S3Client
_オブジェクトにはそのためのメソッドがあります。 $filesystem->getAdapter()->getClient()->getObjectUrl($bucket, $key);
を実行できます。もちろん、URLの作成は説明したとおり簡単です。そのため、特別なメソッドは必要ありません。
私はLaravel 5.2を使用しており、以下のコードは正常に機能しているようです。
Storage::cloud()->url('filename');
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;
}
多分私はこの質問に少し遅れていますが、ここに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');
Storage :: cloud()の別の形式:
/** @var FilesystemAdapter $disk */
$s3 = Storage::disk('s3');
return $s3->url($path);