Laravel 的存储框架实际上使用了三种不同的“类型”或“格式”,尽管文档没有明确说明:
- 一个“短”路径,可以传递给存储框架的大多数方法,并且始终与磁盘相关,例如
Storage::put('the/short/path', $content)
. - 作为下载链接的结果
Storage::url('the/short/path')
并适合作为下载链接的 URL - 一个“完整”路径,它是
Storage::path('the/short/path')
. 全路径的格式取决于底层存储引擎的具体实现
存储层提供了复制Storage::copy(string $src, string $dst)
和移动Storage::move(string $src, string $dst)
文件的方法。源和目标支持什么路径类型/格式?该文档没有说明任何内容。虽然目的地总是必须是一条短路径似乎相当明显(因为目的地应该在磁盘内的某个地方),但我想知道这是否也适用于源。尤其是:
可以
$src
是完全限定的 URL 吗?例如,是否Storage::copy('https://upload.wikimedia.org/wikipedia/commons/somefile.xyz', 'the/short/path')
可以将可下载文件的副本放入存储中?注意,这个问题特别有趣,如果存储不是本地存储,则放入 S3 存储。我如何直接将文件从另一台服务器加载到 S3 存储桶中,而不使用先将文件下载到自己的机器然后再次上传文件的绕道?
如何将存储在自己机器上的文件复制/移动到存储中?例如,是否
Storage::move('/an/absolute/path/to/file/on/current/machine', 'the/short/path')
可以将文件移动/复制到存储中(假设设置了足够的权限)?如何以最有效的方式在不同存储之间移动/复制文件?
如果两个存储都是本地存储?
当然,我可以做这样的事情
$srcFullPath = Storage::disk('local1')->path('short/path/of/src'); $dstFullPath = Storage::disk('local2')->path('short/path/to/dst'); @rename(srcFullPath, dstFullPath);
但这感觉不对。
如果两个存储是不同的 S3 存储?
下面的工作吗?
$srcURL = Storage::disk('s3-foo')->url('short/path/of/src'); Storage::disk('s3-bar')->path(srcURL, 'short/path/to/dst');
在混合情况下?
如果存储类型未知?