引言
在Web开发中,文件上传下载是常见的需求。使用Servlet技术,我们可以轻松实现这一功能,无需依赖第三方库。本文将详细介绍如何使用Servlet进行文件上传下载,帮助开发者告别繁琐操作。
文件上传
1. 准备工作
首先,确保你的项目中已经包含了Servlet API。如果是Maven项目,可以在pom.xml中添加以下依赖:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
2. 编写上传页面
创建一个HTML页面,包含一个表单用于上传文件。表单的enctype
属性设置为multipart/form-data
,确保文件能够以二进制形式上传。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<form action="UploadServlet" method="post" enctype="multipart/form-data">
<input type="file" name="file" />
<input type="submit" value="上传" />
</form>
</body>
</html>
3. 编写UploadServlet
创建一个继承自HttpServlet
的类,重写doPost
方法处理文件上传请求。
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 java.io.File;
import java.io.IOException;
import java.io.InputStream;
@WebServlet("/UploadServlet")
public class UploadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取上传文件的输入流
InputStream inputStream = request.getPart("file").getInputStream();
// 设置上传文件的保存路径
String uploadPath = getServletContext().getRealPath("/") + "uploads/";
File uploadDir = new File(uploadPath);
if (!uploadDir.exists()) {
uploadDir.mkdirs();
}
// 获取上传文件的文件名
String fileName = request.getPart("file").getSubmittedFileName();
// 创建上传文件的输出流
File file = new File(uploadPath + fileName);
java.io.OutputStream outputStream = new java.io.FileOutputStream(file);
// 读取输入流,写入输出流
byte[] buffer = new byte[1024];
int len;
while ((len = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, len);
}
// 关闭流
outputStream.close();
inputStream.close();
// 返回上传成功信息
response.getWriter().write("文件上传成功!");
}
}
4. 配置web.xml
在web.xml中配置UploadServlet。
<web-app>
<servlet>
<servlet-name>UploadServlet</servlet-name>
<servlet-class>UploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UploadServlet</servlet-name>
<url-pattern>/UploadServlet</url-pattern>
</servlet-mapping>
</web-app>
文件下载
1. 编写下载页面
创建一个HTML页面,包含一个表单用于选择下载文件。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件下载</title>
</head>
<body>
<form action="DownloadServlet" method="post">
<input type="text" name="filename" placeholder="请输入文件名" />
<input type="submit" value="下载" />
</form>
</body>
</html>
2. 编写DownloadServlet
创建一个继承自HttpServlet
的类,重写doPost
方法处理文件下载请求。
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
@WebServlet("/DownloadServlet")
public class DownloadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取下载文件的文件名
String fileName = request.getParameter("filename");
// 设置下载文件的保存路径
String downloadPath = getServletContext().getRealPath("/") + "uploads/";
File file = new File(downloadPath + fileName);
// 设置响应头
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
// 获取下载文件的输出流
ServletOutputStream outputStream = response.getOutputStream();
// 读取下载文件的输入流,写入输出流
FileInputStream fileInputStream = new FileInputStream(file);
byte[] buffer = new byte[1024];
int len;
while ((len = fileInputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, len);
}
// 关闭流
outputStream.close();
fileInputStream.close();
}
}
3. 配置web.xml
在web.xml中配置DownloadServlet。
<web-app>
<servlet>
<servlet-name>DownloadServlet</servlet-name>
<servlet-class>DownloadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DownloadServlet</servlet-name>
<url-pattern>/DownloadServlet</url-pattern>
</servlet-mapping>
</web-app>
总结
通过本文的介绍,相信你已经掌握了使用Servlet进行文件上传下载的方法。在实际开发中,你可以根据需求进行扩展和优化,例如添加文件大小限制、文件类型限制等。希望本文能帮助你轻松实现文件上传下载功能。