Java - 使用HttpServletResponse下载文件 - 下载后文件被破坏

时间:2017-10-27 04:05:47

标签: java file servlets response fileinputstream

我试图在表单提交后从我的本地文件系统下载文件。我正在使用以下代码获取FileInputStream并写入HttpServletResponse。

        PrintWriter out = response.getWriter();
        response.setCharacterEncoding("UTF-8");
        String filename = "DSR.xlsx";   
        response.setContentType("application/octet-stream");   
        response.setHeader("Content-Disposition","attachment; filename=\"" + filename + "\"");   

        FileInputStream fileInputStream = new FileInputStream("C://Users/Metro/Desktop/DSR.xlsx");  

        int i;   
        while ((i=fileInputStream.read()) != -1) {  
        out.write(i);   
        }   
        fileInputStream.close();  
        out.close();

文件正在下载但文件已损坏。它只适用于文本文件。我希望代码能够用于.xlsx,.pdf,.jpg等。

2 个答案:

答案 0 :(得分:0)

问题在于ContentType。

您必须设置与文件扩展名相关的内容类型。

对于excel

response.setContentType("application/vnd.ms-excel")

对于pdf

response.setContentType("application/pdf")

对于jpg

response.setContentType("image/jpeg")

[请参阅此链接以了解所有mime类型]

https://www.sitepoint.com/mime-types-complete-list/

答案 1 :(得分:0)

我使用java.nio.file.Files.copy(Path source,OutputStream out)解决了这个问题。

        response.setCharacterEncoding("UTF-8");
        String filename = "DSR.xlsx";   
        response.setContentType("application/octet-stream");   
        response.setHeader("Content-Disposition","attachment; filename=\"" + filename + "\"");   

        try (OutputStream out = response.getOutputStream()){
            File toBeCopied = new File("C://Users/Metro/Desktop/DSR.xlsx");
            Path path = toBeCopied.toPath();
            Files.copy(path, out);
            out.flush();
        }catch(IOException e){
            e.printStackTrace();
        }

适用于任何文件类型(.jpg,.xlsx,.pdf)

相关问题