Как я могу перенести файл из одной корзины в другую, используя flysystem?

В одной корзине есть объекты, которые мне иногда нужно перенести во другую корзину в Amazon S3. Я использую Laravel 5.3 с Flysystem для управления этими корзинами.

Одним из решений является загрузка изображений на мой сервер, а затем загрузка их в другое хранилище, но это кажется пустой тратой времени / полосы пропускания, поскольку файл существует в S3 и перемещается в S3. Можно ли это сделать в Flysystem или мне нужно будет напрямую использовать API Amazon?

2 ответа

Решение

Вы можете использовать функцию перемещения FilesystemAdapter для перемещения файла:

$disk = Storage::disk('s3');
if (!$disk->move('bucketOne/testFile.jpg', 'bucketTwo/testFile.jpg')) {
   throw new \Exception('File could not be moved.');
}

Я нашел решение. Вот мой код:

try {
    $s3 = Storage::disk('s3');
    $s3_temp = $s3->getDriver()->getAdapter()->getClient()->copy(
        env('S3_BUCKET_ORIGIN'),
        $file_path_origin,
        env('S3_BUCKET_DEST'),
        $file_path_dest,
        'public-read'
    );
} catch(\Exception $e) {
    dd($e->getMessage());
}

Помните, что файловая система S3 Laravel использует SDK aws-s3-v3, поэтому вы ищите библиотеки aws-s3-v3, чтобы увидеть, какие функции имеет обертка Laravel.

Итак, в этом примере я получил клиентский класс aws-s3, поэтому в документации я обнаружил, что с помощью этого класса я могу перемещать файл из одного сегмента в другой.

Документация по S3 Php - класс клиента - метод копирования

Для Laravel > 5.6

 try {
        // creat two disk s3 and s3new 
        $fs = Storage::disk('s3')->getDriver();
        $stream = $fs->readStream('file_path/1.jpg');
        $new_fs = Storage::disk('s3new')->getDriver();
        //will create new folder damages if not available 
        $new_fs->writeStream(
            'damages/newfile.jpg',$stream
        );
    } catch(\Exception $e) {
        dd($e->getMessage());
    }
Другие вопросы по тегам