Laravel перемещает файлы с одного диска на другой, используя `Storage`
У меня есть два диска, определенные в моем filesystems.php
файл конфигурации:
'd1' => [
'driver' => 'local',
'root' => storage_path('app/d1'),
],
'd2' => [
'driver' => 'local',
'root' => storage_path('app/d2'),
],
Этим диском также могут быть сегменты 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);
и оставив исходный файл на d1, так как это меня не беспокоит (я периодически удаляю файлы из d1).
Мои вопросы:
Является ли приведенный ниже код атомарным, как я могу проверить, был ли он, а если нет, то как сделать его атомарным (для сценариев, когда файлы имеют размер 1 ГБ или что-то похожее по размеру):
$f = 'myfile.txt';
$file = Storage::disk('d1')->get($f);
Storage::disk('d2')->put($f, $file);
Storage::disk('d1')->delete($f);
Существует ли простой способ перемещения файлов с одного диска на другой с помощью Storage
фасад. В данный момент мне нужно, чтобы он работал с одного локального диска на другой, но в будущем мне может понадобиться переместить их из одного сегмента S3 в тот же, из одного сегмента S3 в другой или из локального диска в сегмент S3.
Спасибо
2 ответа
Я думаю, что этот способ чище и работает, если вы используете удаленные пути
$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);
}
Метод перемещения может использоваться для переименования или перемещения существующего файла в новое место.
Storage::move('old/file.jpg', 'new/file.jpg');
Однако для этого между дисками необходимо указать полный путь к перемещаемому файлу.
// 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);