【发布时间】:2015-04-11 02:51:44
【问题描述】:
我正在使用存储提供程序将文件上传到机架空间,就像这样......
$logo = $request->file('logo');
$content = fopen($logo->getRealPath(), 'r+');
\Storage::disk('cdn')->put('logo.png', $content);
现在,我怎样才能得到上面文件的 url?我一直在寻找API中的方法,似乎不可能。
【问题讨论】:
我正在使用存储提供程序将文件上传到机架空间,就像这样......
$logo = $request->file('logo');
$content = fopen($logo->getRealPath(), 'r+');
\Storage::disk('cdn')->put('logo.png', $content);
现在,我怎样才能得到上面文件的 url?我一直在寻找API中的方法,似乎不可能。
【问题讨论】:
我通常将磁盘公共 URL 存储在 config/filesystems.php 文件中。例如:
'google' => [
'driver' => 's3',
'key' => env('STORAGE_GOOGLE_KEY'),
'secret' => env('STORAGE_GOOGLE_SECRET'),
'bucket' => env('STORAGE_GOOGLE_BUCKET'),
'base_url' => 'https://storage.googleapis.com',
'public_url' => env('STORAGE_GOOGLE_PUBLIC_URL'),
],
然后在我的模型中,我为包含文件名的字段定义了一个 mutator:
public function getAvatarAttribute($value)
{
// If avatar isn't a URL, generate it
if (filter_var($value, FILTER_VALIDATE_URL) !== FALSE) {
return $value;
} else {
$disk = config('filesystems.default');
return config('filesystems.disks.'.$disk.'.public_url').'/avatars/'.$value;
}
}
这让我:
【讨论】:
这里的问题是FlySystem adapter 的工作方式。
对于大多数操作,它只会返回一个布尔值,指示操作是否成功。 甚至 Laravel 的 FlySystem 包装器也不会跟踪路径,因此解决方法是在成功上传后自己构建路径。
通过使用文件系统配置,我们可以想出这样的东西:
$cdn_url = config('filesystems.disks.cdn.container').'/logo.png';
你明白了。
【讨论】:
在最近的 Laravel 版本中,您可以自定义存储 URL
https://laravel.com/docs/8.x/filesystem#url-host-customization
网址主机自定义
如果您想为使用生成的文件 URL 预定义主机 Storage 门面,你可以添加一个 url 选项到磁盘的 配置数组:
'public' => [ 'driver' => 'local', 'root' => storage_path('app/public'), 'url' => env('APP_URL').'/storage', 'visibility' => 'public', ],
例如'url' => 'https://cdn.example.com', 或者只是将它添加到 .env 文件中(默认情况下对于 s3 它是 AWS_URL)
【讨论】: