Firefox сокращает файлы, имя которых содержит пробелы, в приложении Struts

#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.

Вот и мы

http://support.mozilla.com/tiki-view_forum_thread.php?locale=noamp;forumId=1amp;comments_parentId=91513

Это другое, но это может помочь 🙂

Наслаждаться