2008-10-07 11 views
16

Ich benutze die nächste Klasse (vereinfacht um der Verständlichkeit Willen), um Bilder in einer Struts-Webanwendung herunterzuladen. Es funktioniert gut in jedem Browser außer Firefox, die Namen mit Leerzeichen schneidet. Das heißt: Datei mit Leerzeichen.pdf wird in Firefox heruntergeladen als: Datei während in Chrome, IE7 IE6 als Datei mit Leerzeichen heruntergeladen wird.pdf.Firefox schneidet Dateien, deren Name Leerzeichen enthält, in einer Struts-Anwendung

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(); } 
      } 
     } 
    } 
} 

Weiß jemand, was hier vor sich geht? Hinweis Ich verwende Firefox 3.0.3 unter Windows Vista.

Antwort

33

Der Dateiname sollte eine Zeichenfolge sein. (Nach Section 19.5.1 of RFC 2616)

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

Ich benutze Grails und als ich das gleiche versuchte, hatte ich Probleme mit einem zusätzlichen Leerzeichen am Ende des Dateinamens. Hier ist mein Code: response.setHeader ("Content-disposition", "attachment; filename = \" $ {meuArquivo.nome} \ "") ohne Leerzeichen. – meurer

1

URLEncode helfen?

Oder mindestens% 20 für das Leerzeichen ersetzen.

(ich weiß nicht, ob dies funktionieren wird, aber es zu versuchen)

haben Sie versucht gerade Anführungszeichen um den Dateinamen als auch setzen?

+0

Können Sie erklären, was Sie mit URLEncode meine ich? –

+0

http://java.sun.com/j2se/1.5.0/docs/api/java/net/URLEncoder.html – JeeBee

+0

, aber Sie könnten versuchen,% 20 anstelle von Speicherplatz zuerst mit einem einfachen Regex ersetzen zu verwenden. Ich weiß nicht, ob es funktioniert, weil es Inhalt in einem HTML-Header ist, aber für 5 Sekunden Arbeit ist es einen Versuch wert. – JeeBee