2013-08-02 4 views
0

У меня есть следующий код на Spring Controllerрасширение файла Content-Disposition не работает должным образом на Firefox

@RequestMapping(value = "/download", method = RequestMethod.POST) 
public void downloadActive(@RequestParam(value = "type") String offerType, HttpServletResponse response, 
      HttpSession session) throws Exception { 

StringBuilder b = new StringBuilder();. 
. 
. 

response.addHeader("Content-Disposition: ", "attachment; filename=my" + offerType + "Offers.csv"); 
response.getWriter().write(b.toString()); 
.. 

} 

Этот код получить выполняется, когда кнопка загрузки из Ext, щелкают. В chrome он непосредственно загружает файл в формате * .csv, и когда пользователь открывает его, он автоматически использует Excel для открытия файла, если он уже установлен, и это правильное поведение, которое я хотел иметь.

Однако, в firefox, он предлагает сохранить как окно с открытыми и сохраненными параметрами. Если я использую open с опцией, он сообщает мне, что filename является filename.csv, но тип - хром htm-файл. Я не упоминал htm нигде в моем коде, и я не знаю, почему он пытается открыть его как htm вместо файла csv. Когда он пытается открыть его, он приносит приложение excel, и содержимое находится в плохом формате.

Есть ли способ избежать этой проблемы на firefox?

Благодаря

+0

Получить HTTP след и показать нам все поля заголовка ответа. –

+0

Сегодня я столкнулся с этой проблемой, и ни один из других предложений в этой теме не работал. В моем случае это был файл XLSX для загрузки. Все браузеры, кроме Firefox, работают очень хорошо. Я также использую Spring MVC, как вам кажется. Я добавил аннотацию 'производит', чтобы включить тип MIME Excel, и теперь он исправляет проблему в Firefox. В моем случае это означало аннотацию контроллера: '@RequestMapping (method = RequestMethod.POST, производит =" application/vnd.openxmlformats-officedocument.spreadsheetml.sheet ")' – jwj

ответ

3

Добавление двойные кавычки (") для имени файла исправляет эту проблему.

response.setHeader("Content-disposition", "attachment; filename=\"" + fileName + ""); 
+0

Я сегодня столкнулся с этой проблемой и попытался применить исправление с двойной кавычкой, как вы предполагали, хотя это не имело никакого значения. Также обратите внимание, что кавычки после имени файла фактически будут '' \ "" ', а не' '' '. – jwj

0

Даже если я не знаю, почему он работал, изменяя метод AddHeader к SetHeader исправили проблему.

response.setHeader("Content-Disposition: ", "attachment; filename=my" + offerType + "Offers.csv"); 
+0

Я уверен, что конечный ": "в параметре имени заголовка неверно. Кроме того, вы хотите установить Content-Type. –

0
PrintWriter printWriter = resourceResponse.getWriter(); 
java.util.Date date = new java.util.Date(); 
resourceResponse.setContentType("text/csv"); 
resourceResponse.addProperty(HttpHeaders.CACHE_CONTROL, 
     "max-age=0, must-revalidate"); 
resourceResponse.setProperty(
     HttpHeaders.CONTENT_DISPOSITION, 
     "attachment; filename=" + "export_build" + "_" 
       + date.getTime() + ".csv"); 
printWriter.write(stringBuilder.toString()); 

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

-1

response.setContentType ("application/octet-stream"); // No I18n
response.setHeader ("Content-Disposition", "attachment; filename = \" "+" response.txt "+" \ ""); response.getOutputStream(). Write ("sss" .getBytes());

Это не работает .. это запрос Ajax XHR запрос сообщение