#java #firefox #struts
Вопрос:
Я использую следующий класс (упрощенный для удобства понимания) для загрузки изображений в веб-приложении struts. Он отлично работает в любом браузере, кроме firefox, который сокращает имена, содержащие пробелы. То есть: файл с пробелами.pdf загружается в firefox как: файл, в то время как в chrome IE7 IE6 загружается как файл с пробелами.pdf.
public class Download extends Action {
private static final int BUFFER_SIZE = 4096;
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws Exception {
String filename = "file with spaces.pdf";
File file = ... // variable containing the file;
response.setStatus(HttpServletResponse.SC_OK);
response.setContentType(getMimeType(request, file));
response.setHeader("Content-Type", getMimeType(request, file));
response.setHeader("Content-Disposition","attachment; filename=" filename);
InputStream is = new FileInputStream(file);
sendFile(is, response);
return null;
}
protected String getMimeType(HttpServletRequest request, File file) {
ServletContext application = super.servlet.getServletContext();
return application.getMimeType(file.getName());
}
protected void sendFile(InputStream is, HttpServletResponse response) throws IOException {
BufferedInputStream in = null;
try {
int count;
byte[] buffer = new byte[BUFFER_SIZE];
in = new BufferedInputStream(is);
ServletOutputStream out = response.getOutputStream();
while(-1 != (count = in.read(buffer)))
out.write(buffer, 0, count);
out.flush();
} catch (IOException ioe) {
System.err.println("IOException in Download::sendFile");
ioe.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException ioe) { ioe.printStackTrace(); }
}
}
}
}
Кто-нибудь знает о том, что здесь происходит? Примечание. Я использую firefox 3.0.3 под Windows Vista.
Ответ №1:
Имя файла должно быть строкой в кавычках. (В соответствии с разделом 19.5.1 RFC 2616)
response.setHeader("Content-Disposition","attachment; filename="" filename """);
Комментарии:
1. Я использую grails, и когда я попытался сделать то же самое, у меня возникли проблемы с дополнительным пробелом в конце имени файла, поэтому вот мой код: response.setHeader(«Расположение содержимого», «вложение;имя файла=»${meuArquivo.nome}»») без пробелов.
Ответ №2:
URL-код файла?
Или, по крайней мере, замените символ пробела на .
(Я не знаю, сработает ли это, но попробуйте)
вы пробовали также просто заключать имя файла в кавычки?
Комментарии:
1. но вы можете попробовать сначала использовать вместо пробела с простой заменой регулярного выражения. Не знаю, сработает ли это, потому что это содержимое в заголовке HTML, но для 5-секундной работы стоит попробовать.
Ответ №3:
Я считаю, что это функция безопасности firefox 3.
Вот и мы
Это другое, но это может помочь 🙂
Наслаждаться