Laravel Zipstream добавить файл из потока

Я пытаюсь заставить ZipStream работать в Laravel 5.4. Я хочу, чтобы потоковые файлы из s3, чтобы создать ZipStream, который возвращается в браузер.

В настоящее время мой код создает поврежденные ZIP-файлы того же размера, что и действительные ZIP-файлы.

Это мой метод действия:

public function mediaZip(User $user)
{
    return response()->stream(function () use ($user) {
        $zip = new ZipStream($user->name . ".zip", [
            'content_type' => 'application/octet-stream'
        ]);

        foreach ($user->media as $medium) {
            $stream = Storage::disk("s3")->readStream($medium->location);
            $zip->addFileFromStream($medium->name, $stream);
        }

        $zip->finish();
    });
}

Если я читаю каждый файл в память, используя приведенный ниже код, файлы ZIP работают нормально. Это, однако, нежелательно, так как я буду работать с файлами, размер которых может быть несколько гигабайт.

public function mediaZip(User $user)
{
    return response()->stream(function () use ($user) {
        $zip = new ZipStream($user->name . ".zip", [
            'content_type' => 'application/octet-stream'
        ]);

        foreach ($user->media as $medium) {
            $file = Storage::disk("s3")->read($medium->location);
            $zip->addFile($medium->name, $file);
        }

        $zip->finish();
    });
}

Может кто-нибудь помочь мне выяснить, что не так с файлами ZIP?

Спасибо!

1 ответ

Решение

Получил это, указав "магазин" для storage_method пары.

$zip->addFile($medium->name, $file, [], "store");

Другие вопросы по тегам