var result = controller.ActioName(objParams);
IDictionary<string, object> data = (IDictionary<string, object>)new System.Web.Routing.RouteValueDictionary(result.Data);
Assert.AreEqual("Table already exists.", data["Message"]);
Я не уверен, что правильный способ сделать это с помощью Flysystem, но у базового объекта S3Client
есть способ для этого. Вы можете сделать $filesystem->getAdapter()->getClient()->getObjectUrl($bucket, $key);
. Конечно, создание URL-адреса так же тривиально, как описано, поэтому вам действительно не нужен специальный метод.
Я использую Laravel 5.2, и код ниже, казалось, работал нормально.
Storage::cloud()->url('filename');
Возможно, я немного опаздываю на этот вопрос, но вот способ использования встроенной файловой системы Laravel 5.
Я создал класс Manager, который расширяет файловый менеджер Laravel для обработки общедоступного поиска URL:
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);
}
}
Затем я добавил этот класс в 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';
}
}
Теперь я могу легко получить общедоступный url для моих общедоступных объектов в своей локальной и s3-файловой системах (обратите внимание, что я ничего не добавлял для ftp или rackspace в FilesystemPublicUrlManager):
$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');
При обновлении до 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;
}