Принудительная загрузка по ссылке ftp://

У меня есть PHP, который сканирует файлы на удаленном жестком диске NAS по протоколу FTP, создает файл json, а затем с помощью javascript я перечисляю эти файлы в браузере.

Когда пользователь щелкает ссылку на mp4, jpg и многие известные браузеру форматы, браузер открывает контент, а не загружает его.

Теперь я знаю, что с помощью PHP или .htaccess я могу изменить заголовки, чтобы заставить браузер загрузить файл, но файл находится в удаленном месте, и доступ к нему возможен только через FTP, поэтому я не могу запустить в нем PHP или .htaccess. .

Я пробовал эти варианты заголовка в PHP:

header("Content-Type: application/octet-stream");
header("Content-Transfer-Encoding: Binary");
header("Content-Disposition: attachment; filename=\"$file\""); 

or

header("Content-Description: File Transfer"); 
header("Content-Type: application/octet-stream"); 
header("Content-Disposition: attachment; filename=\"$file\"");

or

header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Disposition: attachment; filename=$file");
header("Content-Type: application/image");
header("Content-Transfer-Encoding: binary");

все заканчивается на:

header("Location: $url");

(URL-адрес ftp://user:[email protected]/folder/file.mp4), но он всегда открывает файл в браузере вместо загрузки (конечно, с распознанными расширениями файлов)

Любые идеи? Спасибо


person Juan Ignacio    schedule 08.07.2013    source источник
comment
Создаваемые вами URL-адреса указывают непосредственно на NAS? Если это так, вы можете использовать свое веб-приложение в качестве посредника между NAS и браузером, и в этом случае вы сможете добавить любой заголовок, какой пожелаете.   -  person Tarik    schedule 08.07.2013


Ответы (1)


Предыдущие заголовки могут не работать при использовании перенаправления. Вместо этого вам лучше обслуживать их через PHP вместо перенаправления:

header("Content-type: octet/stream");
header("Content-disposition: attachment; filename=".$file);
header("Content-Length: ".filesize($file));
readfile($file);

Но обратите внимание, что это будет использовать вашу собственную пропускную способность. Однако нет никакого способа заставить поведение на удаленном узле.

person user2557188    schedule 08.07.2013
comment
Я думал об этом, но я могу запустить php-файл только на 2 минуты, и если пользователь загружает видео, это, скорее всего, займет больше времени, и оно будет отключено, когда истечет время ожидания. И все же я думаю, что это единственный вариант - person Juan Ignacio; 08.07.2013