Java Web 应用中文件上传与下载的实现方法
在 Java Web 应用开发中,文件上传和下载是常见的功能需求。本文将详细介绍在 Java Web 应用中处理文件上传和下载的具体实现方法。
一、文件上传
(一)前端准备
在 HTML 表单中,需要设置 enctype="multipart/form - data"
,以确保文件能够正确地被编码并发送到服务器。例如:
<form action="upload" method="post" enctype="multipart/form - data">
<input type="file" name="file">
<input type="submit" value="上传">
</form>
(二)后端实现
在 Java 后端,通常使用 Apache Commons FileUpload 库来处理文件上传。
- 引入依赖:在 Maven 项目中,添加以下依赖:
<dependency> <groupId>commons - fileupload</groupId> <artifactId>commons - fileupload</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>commons - io</groupId> <artifactId>commons - io</artifactId> <version>2.6</version> </dependency>
- 编写 Servlet 处理上传:以下是一个简单的文件上传 Servlet 示例:
import java.io.File; import java.io.IOException; import java.util.List;
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload;
@WebServlet("/upload") public class UploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; private static final String UPLOAD_DIRECTORY = "uploads";
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (isMultipart) {
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
try {
List<FileItem> items = upload.parseRequest(request);
for (FileItem item : items) {
if (!item.isFormField()) {
String fileName = new File(item.getName()).getName();
String filePath = getServletContext().getRealPath("") + File.separator + UPLOAD_DIRECTORY
+ File.separator + fileName;
File storeFile = new File(filePath);
item.write(storeFile);
}
}
response.getWriter().println("文件上传成功!");
} catch (FileUploadException e) {
e.printStackTrace();
response.getWriter().println("文件上传失败!");
} catch (Exception e) {
e.printStackTrace();
response.getWriter().println("文件上传失败!");
}
} else {
response.getWriter().println("不是有效的文件上传请求!");
}
}
}
此 Servlet 首先检查请求是否为多部分内容,然后使用 FileUpload 库解析请求,将上传的文件保存到指定目录。
## 二、文件下载
### (一)后端实现
文件下载的实现主要是通过设置响应头,告诉浏览器这是一个下载操作,并将文件内容写入响应输出流。以下是一个简单的文件下载 Servlet 示例:
```java
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/download")
public class DownloadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final String DOWNLOAD_DIRECTORY = "uploads";
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String fileName = request.getParameter("fileName");
String filePath = getServletContext().getRealPath("") + File.separator + DOWNLOAD_DIRECTORY
+ File.separator + fileName;
File file = new File(filePath);
if (file.exists()) {
response.setContentType("application/octet - stream");
response.setHeader("Content - Disposition", "attachment; filename=\"" + fileName + "\"");
FileInputStream in = new FileInputStream(file);
OutputStream out = response.getOutputStream();
byte[] buffer = new byte[4096];
int length;
while ((length = in.read(buffer)) > 0) {
out.write(buffer, 0, length);
}
in.close();
out.flush();
out.close();
} else {
response.getWriter().println("文件不存在!");
}
}
}
此 Servlet 获取要下载的文件名,设置响应头为附件形式,并将文件内容写入响应输出流,从而实现文件下载功能。
在 Java Web 应用中,通过合理使用相关库和设置响应头,能够轻松实现文件的上传和下载功能,为用户提供更丰富的交互体验。
本文链接:https://blog.runxinyun.com/post/598.html 转载需授权!
留言0