brn*_*nd0 5 atomic amazon-s3 laravel-filesystem laravel-5.6
我的filesystems.php配置文件中定义了两个磁盘:
'd1' => [
'driver' => 'local',
'root' => storage_path('app/d1'),
],
'd2' => [
'driver' => 'local',
'root' => storage_path('app/d2'),
],
Run Code Online (Sandbox Code Playgroud)
这些磁盘也可以是 Amazon S3 存储桶,并且可以是 S3 存储桶和本地磁盘的组合。
假设我有一个文件app/d1/myfile.txt想要移动到app/d2/myfile.txt.
我现在正在做的是
$f = 'myfile.txt';
$file = Storage::disk('d1')->get($f);
Storage::disk('d2')->put($f, $file);
Run Code Online (Sandbox Code Playgroud)
并将原始文件保留在 d1 上,因为它不会打扰我(我定期从 d1 中删除文件)。
我的问题是:
下面的代码是否是原子的,我如何检查它是否是原子的,如果不是,我如何使其成为原子的(对于文件大小为 1GB 或类似大小的情况):
$f = 'myfile.txt';
$file = Storage::disk('d1')->get($f);
Storage::disk('d2')->put($f, $file);
Storage::disk('d1')->delete($f);
Run Code Online (Sandbox Code Playgroud)
有没有一种简单的方法可以使用Storage外观将文件从一个磁盘移动到另一个磁盘。目前,我需要它从一个本地磁盘工作到另一个本地磁盘,但将来我可能需要将它们从一个 S3 存储桶移动到同一个存储桶,从一个 S3 存储桶移动到另一个 S3 存储桶,或者从本地磁盘移动到 S3 存储桶。
谢谢
我认为如果您使用远程路径,这种方式更干净并且有效
$directories = ['dir1', 'dir2', 'dir3'];
$from = 'public';
$to = 'assets';
foreach($directories as $directory){
$files = Storage::disk($from)->allFiles($directory);
foreach ($files as $file) {
Storage::disk($to)->writeStream($file, Storage::disk($from)->readStream($file));
// If you no longer need the originals
//Storage::disk($from)->delete($file);
}
Storage::disk($from)->deleteDirectory($directory);
}
Run Code Online (Sandbox Code Playgroud)
move 方法可用于重命名现有文件或将现有文件移动到新位置。
Storage::move('old/file.jpg', 'new/file.jpg');
Run Code Online (Sandbox Code Playgroud)
但是,要在磁盘之间执行此操作,您需要具有要移动的文件的完整路径。
// convert to full paths
$pathSource = Storage::disk($sourceDisk)->getDriver()->getAdapter()->applyPathPrefix($sourceFile);
$destinationPath = Storage::disk($destDisk)->getDriver()->getAdapter()->applyPathPrefix($destFile);
// make destination folder
if (!File::exists(dirname($destinationPath))) {
File::makeDirectory(dirname($destinationPath), null, true);
}
File::move($pathSource, $destinationPath);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10816 次 |
| 最近记录: |