Как выбрать имя файла, когда пользователь использует «сохранить как»? - PullRequest
1 голос
/ 21 августа 2011

Я реализовал базовую загрузку / выгрузку файлов поверх хранилища данных AppEngine.
Функциональность, которую я хочу, заключается в том, что файл с именем «base.c» будет открыт в виде текстового файла. поэтому я сделал следующее:
(конечно, мой код для общего случая, но этот конкретный пример иллюстрирует проблему)

resp.setContentType("text/plain");
resp.setHeader("Content-Disposition", "inline; filename=base.c");

Это откроет его как текстовый файл в браузере, который как раз то, что мне нужно.
Но я также хочу, чтобы, когда пользователь использовал опцию браузера «сохранить страницу как ...», он предлагал исходное имя «base.c». Это делает именно это в Firefox (6), но по умолчанию дает имя «download» в chrome (15) и safari (5).
Еще хуже - при выборе base.c в качестве имени файла chrome предупреждает пользователя, что это неправильное расширение, и запрашивает подтверждение для продолжения.
Теперь, если я использую «attachment» вместо «inline», он не открывает файл, а загружает его с именем right .

Что я могу сделать, чтобы сохранить по умолчанию как .. name быть "base.c"?
Это ошибка браузера или я неправильно использую заголовки HTTP?

(если это поможет, все тесты были на OSX 10.6, и сайт загрузки имеет вид:
HTTP: //------.appspot.com/download имя = base.c )

Ответы [ 4 ]

3 голосов
/ 22 августа 2011

Я думаю, что большинство браузеров по умолчанию выбирают имя страницы в качестве текущей страницы для опции сохранения как.

Одним из вариантов может быть изменение URL-адреса с appspot / download? Name = base.c на appspot.com/download/base.c с использованием шаблона url в web.xml.

, например

<servlet-mapping>
  <servlet-name>download</servlet-name>
  <url-pattern>/download/*</url-pattern>
</servlet-mapping>

затем проанализируйте URL, чтобы получить имя файла из хранилища данных.

Я прошу прощения, если это не сработает с GAE, я не знаком с ним.

2 голосов
/ 02 сентября 2011

Это известная проблема;см. http://greenbytes.de/tech/tc2231/#inlwithasciifilename - только FF получает это право.

0 голосов
/ 22 августа 2011

Не следует ожидать, что аргумент filename равный Content-Disposition будет соблюден для любого значения, кроме attachment. Лучший вариант, как предлагает @scott, - это изменить сопоставление URL-адреса так, чтобы путь URL-адреса заканчивался желаемым именем файла; это также более удобно для пользователей. Другой вариант, который вы можете использовать совместно, - показать файл, отформатированный внутри HTML-страницы, с «сырой» ссылкой для загрузки, которая отправляет Content-Disposition: attachment, как это делает GitHub.

0 голосов
/ 22 августа 2011

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

...