Как скачать файл с возможностью выбора местоположения - PullRequest
1 голос
/ 25 июня 2011

Я загружаю файл с сервера на локальный компьютер следующим образом:

$file = ( "TestFile.txt" );     
header( "Content-Type: application/octet-stream" );
header( "Accept-Ranges: bytes" );
header( "Content-Length: " . filesize( $file ) );
header( "Content-Disposition: attachment; filename=testfile.txt" );
readfile( $file );

Работает, но всегда сохраняет файл в папке загрузки без указания местоположения. Я хочу открыть окно, как сохранение любого документа в OpenOffice / MS Word с возможностью выбрать любое место в файловой системе и создать новую папку. Мое желаемое окно также открывается, когда мы сохраняем как в окне браузера.

Надеюсь, вы понимаете мою проблему. Можно ли сделать это, которые работают во всех браузерах / ОС.

Спасибо

Ответы [ 3 ]

3 голосов
/ 25 июня 2011

спецификация Content-Disposition гласит, что принимающий пользовательский агент должен игнорировать любой компонент пути в имя файла параметр значение:

Принимающий [пользовательский агент] НЕ ДОЛЖЕН учитывать информацию о пути к каталогу, которая может присутствовать в параметре имени файла.Имя файла следует рассматривать только как компонент терминала.

Причина этого заключается в том, что оно создает уязвимость безопасности :

Поскольку эта памяткапредоставляет способ для отправителя предложить имя файла, получающий [пользовательский агент] должен позаботиться о том, чтобы предлагаемое имя файла отправителя не представляло опасности.Используя UNIX в качестве примера, некоторые опасности могут быть:

  • Создание файлов запуска (например, ".login").
  • Создание или перезапись системных файлов (например, "/etc/passwd ").
  • Перезапись любого существующего файла.
  • Размещение исполняемых файлов в любом пути поиска команд (например," ~/bin/more ").
  • Отправка файла втруба (например, "| sh").
3 голосов
/ 25 июня 2011

Нет такой вещи, которую вы предлагаете.Клиент (т. Е. Веб-браузер) должен решать, как обрабатывать ответы HTTP и, в частности, как обращаться с неотображаемым контентом (таким как ваш octet-stream).Большинство браузеров предлагают вариант загрузки, но не требуется, чтобы это было какой-либо конкретной формы.Передавая предлагаемое имя файла, как вы делаете, это примерно столько же, сколько интерпретируют текущие браузеры.

Конечно, где-то всегда может быть нестандартный браузер, который будет принимать дополнительную информацию заголовка, но в настоящее время этого не делают широко распространенные браузеры.Имейте в виду, что в целом мы не хотим раскрывать какую-либо информацию о среде клиента в Интернете, поэтому даже предложение чего-то вроде пути загрузки может рассматриваться как нарушение этого.Представьте, что я предлагаю /etc/passwd в качестве желаемого местоположения.

Если вы действительно хотите прослушивать жесткие диски ваших посетителей, используйте апплет ActiveX или Java: -)

2 голосов
/ 25 июня 2011

не напрямую через заголовок, но вы можете использовать java-апплет или, возможно, flash для выполнения этой работы.

http://www.javaatwork.com/java-download-applet/details.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...