Java 网络应用 - 下载的文件不可读

Java web app - downloaded file is unreadable

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

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

已解决 File java class.

<%@ 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();
%>

此外,如果您想将文件路径作为 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();
%>