загрузить файл с сервера nginx + php -fpm - PullRequest
0 голосов
/ 26 апреля 2020

Друзья, подскажите. Есть nginx, на нем есть потоковый модуль mp4. Также устанавливается условие:

if ($request_filename ~* ^.*?/([^/]*?)$)
{
set $filename $1;
add_header Content-Disposition "attachment; filename=$filename";
}

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

Задача состоит в следующем: вам нужно как-то организовать загрузку mp4 через fetch (mode: "no-cors") так, чтобы он загружается и / или в кэш браузера, и пользователю показывается диалог загрузки.

Я использую PHP для обработки запросов на выборку. Но видео файл идет напрямую. Я попытался использовать php заголовки, чтобы получить файл для загрузки, но он не работает ..

Оказывается, я запрашиваю файл mp4 следующим образом:

fetch ("'. $fileToDownload.'", {/*$fileToDownload - PHP variable — URL to video file*/
method: "get",
headers: {
"Access-Control-Allow-Origin": "site.org",
},
mode: "no-cors"
});

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

Другие методы, такие как псевдо-щелчок по ссылке, не работают, потому что есть таймер задержки .... Вроде загрузка начинается через 10 секунд. А из-за таймера симуляция нажатия на ссылку не работает, потому что если вы поставите ее на более чем 3 секунды, окно будет заблокировано политикой браузера.

Я попытался использовать загрузку. js, но он проходит через xhr, и через него не передается свойство mode, а загрузка блокируется, поскольку домен, из которого загружается файл, отличается.

Я подозреваю, что вам нужно использовать serviceworker перехватить кеш? ..

Потратил целый день, но оказывается, что я могу только позвонить пользователю, после истечения таймера, нажать на кнопку загрузки, которая кажется скрытой до конца таймера.

Мне просто нужно дать пользователю файл для загрузки. Но из-за того, что он находится в другом домене, а также в виде потока приложения / октета, загрузка блокируется браузером.

окно. открыть, а также окно. location = .. нельзя использовать из-за таймера, windows и перенаправления блокируются браузером, то есть тип mime не соответствует полученному контенту (видео / mp4)

1 Ответ

0 голосов
/ 27 апреля 2020

Я частично нашел ответ в Google ...

Предупреждение. Для ресурсов из разных источников убедитесь, что заголовки CORS установлены правильно. Поскольку мы не можем создать буфер массива из непрозрачного ответа, полученного с помощью fetch (videoFileUrl, {mode: 'no-cors'}), мы не сможем передать ни один видео или аудио элемент.

https://developers.google.com/web/fundamentals/media/fast-playback-with-video-preload

...