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();
%>
我正在 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();
%>