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);
Другие вопросы по тегам