Laravel загружает файлы асинхронно

Я довольно хорошо знаком с очередями Laravel и запускаю асинхронную логику в Laravel путем планирования заданий.

Веб-сайт, который я создаю, должен обрабатывать большие видеофайлы, поэтому мне нужно, чтобы эти загрузки были асинхронными, теперь пользователи ждут загрузки своего файла от 5 до 10 минут.

Это возможно? Как это будет реализовано в очереди Laravel? Что отправляется на сервер в запросе?

Я не могу найти в Google ничего по этой проблеме, поэтому я просто ищу общее руководство.

В идеале пользователь должен выбрать свой файл, нажать «Загрузить», затем запланировано задание по загрузке файла и уведомлению пользователя по электронной почте о завершении.

Спасибо!


person Luke Brandon Farrell    schedule 13.05.2018    source источник
comment
Вы хотите поставить в очередь что-то, что требует, чтобы соединение пользователь-сервер оставалось активным в течение всего времени. Вы не можете поставить это в очередь. Что вы можете сделать, так это просто отправить загрузку во временное место и добавить задачу обработки файла в очередь. Однако сам файл должен находиться в хранилище сервера, чтобы это работало. Имейте в виду, что загрузка файлов является асинхронной в том смысле, что многие пользователи могут загружать файлы одновременно. Пользователю не нужно ждать других загрузок   -  person apokryfos    schedule 13.05.2018
comment
@apokryfos Да, я понимаю. Лучшим способом будет выполнить загрузку с помощью JavaScript и показать пользователю индикатор выполнения.   -  person Luke Brandon Farrell    schedule 13.05.2018


Ответы (1)


Чтобы файлы загружались, страница, инициировавшая загрузку, должна оставаться открытой в течение всего времени загрузки. Это имеет смысл сам по себе, потому что в противном случае, если пользователь решит закрыть страницу во время загрузки, вы можете фактически "украсть" загружаемый файл независимо от действий пользователя.

Единственный практический подход здесь — позволить пользователю выбирать файлы и загружать их с помощью запроса XHR, что-то вроде:

var payload = new FormData();
payload.append('file', document.getElementById('fileInput'));

var xhr = new XMLHttpRequest();
xhr.open('POST', '/upload', true);

xhr.addEventListener('load', function (e) {
    // Do stuff when upload is complete
});

xhr.send(payload);

Асинхронная загрузка файлов позволяет пользователю выполнять другие действия на той же странице, ожидая завершения загрузки (например, заполнять дополнительные данные, необходимые для загрузки).

person Bogdan    schedule 13.05.2018
comment
Спасибо. Это похоже на подход, который я выберу, и покажу пользователю индикатор выполнения. - person Luke Brandon Farrell; 13.05.2018