html5 download и php download не работают на мобильных устройствах - PullRequest
0 голосов
/ 27 февраля 2019

На моем сайте есть ссылка <a download></a>, а также функция php, которая прекрасно загружает файлы на моем рабочем столе -

ob_start();

$nameOld = 'https://my-other-server.online/path/to/file.mp4';
$save = '/var/path/to/file.mp4';
$nameNew = "download.mp4";

file_put_contents($save, fopen($nameOld, 'r'));

set_time_limit(0);

header('Connection: Keep-Alive');
header('Content-Description: File Transfer');
header('Content-Type: application/force-download');
header("Content-Disposition: attachment; filename=$nameNew");
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($save));

      while (ob_get_level()) {
        ob_end_clean();
      }

readfile($save);
exit;

unlink($save);

На мобильных устройствах (iphone) это не работает в браузере Chrome.(Я уже знаю о загрузках Safari ios, хотя я видел, что некоторые загрузки предлагают пользователю открыть другое приложение для продолжения.)

Поэтому я попытался использовать ссылку <a></a> download, но при нажатии наон просто открывает видео в новой вкладке и воспроизводит его.

Если я попытаюсь использовать php-скрипт, он откроет видео на новой вкладке и покажет зачеркнутую кнопку воспроизведения (видео даже не воспроизводится).Я искал ответ в течение нескольких дней, я редактировал файлы .htaccess и тестировал различные скрипты, типы контента, заголовки и т. Д.

Так выглядит текущий скрипт для конкретных мобильных устройств -

... first few lines same as above script ...

file_put_contents($save, fopen($nameOld, 'r'));

//echo file_get_contents($save);
//$headers = get_headers($nameOld, 1);
//$filesize = $headers['Content-Length'];
//set_time_limit(0);

ob_clean();

//if(ini_get('zlib.output_compression'))
               // ini_set('zlib.output_compression', 'Off');
            //$fp = @fopen($save, 'rb');

//header('Connection: Keep-Alive');
//header('Content-Description: File Transfer');
//header('Content-Type: application/force-download');
//header('Content-Type: application/octet-stream');
header('Content-Type: video/mp4');
//header("Content-Disposition: attachment; filename=$nameNew");    
header("Content-disposition: attachment; filename=\"" . basename($save) . "\"");
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
//header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($save));
//ob_end_clean();

     while (ob_get_level()) {
        ob_end_clean();
      }

//fpassthru($fp);
  //          fclose($fp);

readfile($save);
//exit;

unlink($save);    
die();

Я также пытался протестировать печать на мобильном телефоне заголовков одного из файлов -

print_r(get_headers($url));
print_r(get_headers($url, 1));

Сегодня вывод выглядит следующим образом, но вчера тип контента сказал application/octet-stream --

Array ( [0] => HTTP/1.1 200 OK [1] => Date: Wed, 27 Feb 2019 14:51:56 GMT [2] => Server: Apache/2.4.29 (Ubuntu) [3] => Last-Modified: Tue, 26 Feb 2019 14:16:19 GMT [4] => ETag: "3e7e3a-582ccb37e75a7" [5] => Accept-Ranges: bytes [6] => Content-Length: 4095546 [7] => Connection: close [8] => Content-Type: video/mp4 ) Array ( [0] => HTTP/1.1 200 OK [Date] => Wed, 27 Feb 2019 14:51:56 GMT [Server] => Apache/2.4.29 (Ubuntu) [Last-Modified] => Tue, 26 Feb 2019 14:16:19 GMT [ETag] => "3e7e3a-582ccb37e75a7" [Accept-Ranges] => bytes [Content-Length] => 4095546 [Connection] => close [Content-Type] => video/mp4 )

Я также проверил свои настройки php info и не увидел ничего, что могло бы вызвать проблему, но опять же, я не слишком уверен, что искать.

Я знаю, что можно загружать файлы на Chrome Mobile, потому что другие сайты работают для меня, но не для меня.

Что я делаю не так?

Ответы [ 3 ]

0 голосов
/ 06 марта 2019

Добавьте это как заголовок: 'X-Content-Type-Options: nosniff'; это сделано для того, чтобы браузеры не могли интерпретировать полученный контент.В сочетании с Content-disposition: attachment; ... браузер должен предложить загрузить его.

0 голосов
/ 08 марта 2019

Некоторое время назад я пытался создать небольшое приложение, и тег загрузки просто работал для меня в Chrome.Как это:

<a href="http://URL" download target="_blank"> Download </a>

0 голосов
/ 03 марта 2019

Вы уверены, что используете формат:

<a href="myvideo.mp4" download>Download</a>

И, как упоминал miken32:

"Вы устанавливаете тип MIME на video/mp4Если браузер может воспроизводить видео такого типа, он сделает это. Измените его на application/octet-stream. "

РЕДАКТИРОВАТЬ: Вы также можете попытаться установить это в своем .htaccessfile:

AddType application/octet-stream .mp4

И затем измените его обратно на application/octet-stream.

Попробуйте это.

...