Как я могу использовать ресурс для записи построчно, но при этом использовать встроенное хранилище Laravel?

Я хочу использовать Storage::put для записи файла. Файл потенциально очень большой (> 100 МБ), поэтому я хочу использовать поток, чтобы не помещать все вслепую в память.

Я собираюсь сделать несколько запросов API, а затем просмотреть их результаты, поэтому данные, которые я получу, не будут проблемой, они будут ограничены разумными объемами.

Согласно документации, мне нужно использовать:

Storage::put('file.xml', $resource);

Но при чем тут $resource?

Традиционно при написании файлов с использованием PHP я делал это с комбинацией fopen, fwrite и fclose, чтобы писать «построчно». Я создаю файл, перебирая различные коллекции и используя различные API по мере продвижения, поэтому $resource НЕ является указателем файла или ссылкой на файл, как говорится в других местах документации.

Итак, как я могу писать построчно, используя поток и Storage Laravel?


person Mike    schedule 17.10.2017    source источник


Ответы (2)


Storage::put('file.xml', $resource);

Но что здесь может быть за $resource?

$resource — это ваши данные, которые вы готовите для записи на диск с помощью кода.

Если вы хотите записать файл с циклом, вы должны использовать Storage::append($file_name, $data);, как писал ljubadr ранее.

Я написал $data, но вы можете использовать любое имя для переменной внутри цикла.

person Alviero    schedule 07.11.2017

Согласно документации Laravel 5.3, изучите Автоматическую потоковую передачу.

Если вы хотите, чтобы Laravel автоматически управлял потоковой передачей данного файла в ваше хранилище, вы можете использовать метод putFile или putFileAs. Этот метод принимает экземпляр Illuminate\Http\File или Illuminate\Http\UploadedFile и автоматически передает файл в нужное место:

Вы можете загрузить файл с потоковой передачей, как это

$file = $request->file('file');
$path = \Storage::putFile('photos', $file);

Где находится ваша форма ввода

<input type="file" name="file">
person ljubadr    schedule 18.10.2017
comment
Если вы хотите загрузить файл с другим именем, используйте putFileAs. - person ljubadr; 18.10.2017
comment
$file является экземпляром UploadedFile, поэтому вы можете посмотреть доступные методы там. - person ljubadr; 18.10.2017
comment
Что касается моего вопроса, я не загружаю файл и не передаю файл в другой файл. Я пытаюсь написать простой текстовый файл, который я создаю в коде в потоковом режиме. Мне удалось написать это очень легко, используя fopen и fwrite, но я бы предпочел встроенные методы Storage. Я начинаю думать, что это невозможно. - person Mike; 19.10.2017
comment
Извините, я устал, когда отвечал на это. Вы можете попробовать $file_name = 'test.txt'; $is_created = Storage::put($file_name, 'Hello'); Storage::append($file_name, ', '); Storage::append($file_name, 'world'); Storage::append($file_name, '!'); - person ljubadr; 19.10.2017