2

filesystems.php構成ファイルに 2 つのディスクが定義されています。

'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からファイルを削除します)。

私の質問は次のとおりです。

以下のコードはアトミックですか、それがアトミックかどうかを確認するにはどうすればよいですか、そうでない場合はどのようにアトミックにするのですか (ファイルが 1GB または同様のサイズのシナリオの場合):

$f = 'myfile.txt';
$file = Storage::disk('d1')->get($f);
Storage::disk('d2')->put($f, $file);
Storage::disk('d1')->delete($f);

Storageファサードを使用して、あるディスクから別のディスクにファイルを移動する簡単な方法はありますか。現時点では、あるローカル ディスクから別のディスクに移動する必要がありますが、将来的には、ある S3 バケットから同じバケットに、ある S3 バケットから別のバケットに、またはローカル ディスクから S3 バケットに移動する必要があるかもしれません。

ありがとう

4

2 に答える 2

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);
    }
于 2021-10-08T21:38:07.793 に答える
2

move メソッドは、既存のファイルの名前を変更したり、新しい場所に移動したりするために使用できます。

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);
于 2020-08-13T13:10:18.170 に答える