【问题标题】:Java web app - downloaded file is unreadableJava Web 应用程序 - 下载的文件不可读
【发布时间】:2020-08-27 04:18:53
【问题描述】:

我正在 TomCat 9.0.29 上开发 Java Web 应用程序(目前仅在本地 8080 上),我想添加下载文件的可能性。 这是一个简单的download.jsp,我尝试在其中下载我桌面上的图像img.png。当我在浏览器上打开此页面时,它会要求我按应有的方式下载或打开文件。问题是下载的文件不可读,即使它的大小不是 0。为什么会发生,我该如何解决?

下载.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    String filename = "img.png";
    String filepath = "C:\\Users\\Utente\\Desktop\\";
    response.setContentType("APPLICATION/OCTET-STREAM");
    response.setHeader("Content-Disposition","attachment; filename=\"" + filename + "\"");

    java.io.FileInputStream fileInputStream=new java.io.FileInputStream(filepath + filename);

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

下载文件的大小

size on disk: 372KB
size of download: 556KB

【问题讨论】:

    标签: java jsp tomcat web-applications


    【解决方案1】:

    File java 类解决。

    <%@ page import="java.io.File" %>
    <%@ page import="java.io.PrintStream" %>
    <%@ page import="java.io.OutputStream" %>
    <%@ page import="java.io.FileInputStream" %>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%
        File file = new File("C:\\Users\\Utente\\Desktop\\img.png");
        response.setContentType("application/octet-stream");
        response.setContentLength((int) file.length());
        response.setHeader( "Content-Disposition",
                String.format("attachment; filename=\"%s\"", file.getName()));
    
        OutputStream out2 = response.getOutputStream();
        try (FileInputStream in = new FileInputStream(file)) {
            byte[] buffer = new byte[4096];
            int length;
            while ((length = in.read(buffer)) > 0) {
                out2.write(buffer, 0, length);
            }
        }
        out2.flush();
    %>
    

    此外,如果您想将 filePath 作为 url 参数传递,您可以编写如下内容:

    Index.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <a href="downloader.jsp?filePath=C://Users//Utente//Desktop//img.png">link</a>
    
    </body>
    </html>
    

    Downloader.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%
    
        String filePath = request.getParameter("filePath");
        File file = new File(filePath);
        response.setContentType("application/octet-stream");
        response.setContentLength((int) file.length());
        response.setHeader( "Content-Disposition",
                String.format("attachment; filename=\"%s\"", file.getName()));
    
        OutputStream out2 = response.getOutputStream();
        try (FileInputStream in = new FileInputStream(file)) {
            byte[] buffer = new byte[4096];
            int length;
            while ((length = in.read(buffer)) > 0) {
                out2.write(buffer, 0, length);
            }
        }
        out2.flush();
    %>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-26
      • 1970-01-01
      • 1970-01-01
      • 2012-08-18
      • 2016-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多