如何利用Java Servlet实现文件上传下载
要使用Java Servlet实现文件上传和下载,你需要遵循以下步骤:
文件上传
-
添加依赖: 确保你的项目中包含了Apache Commons FileUpload库。如果你使用Maven,可以在
pom.xml中添加以下依赖:<dependency> <groupId>commons-fileuploadgroupId> <artifactId>commons-fileuploadartifactId> <version>1.4version> dependency> <dependency> <groupId>commons-iogroupId> <artifactId>commons-ioartifactId> <version>2.8.0version> dependency> -
创建Servlet: 创建一个Servlet来处理文件上传请求。
import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; 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.util.List; @WebServlet("/upload") public class FileUploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; private static final String UPLOAD_DIRECTORY = "uploads"; private static final int MEMORY_THRESHOLD = 1024 * 1024 * 3; // 3MB private static final int MAX_FILE_SIZE = 1024 * 1024 * 40; // 40MB private static final int MAX_REQUEST_SIZE = 1024 * 1024 * 50; // 50MB @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Check that we have a file upload request boolean isMultipart = ServletFileUpload.isMultipartContent(request); if (!isMultipart) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Not a multipart request"); return; } // Create a factory for disk-based file items DiskFileItemFactory factory = new DiskFileItemFactory(); // Create a new file upload handler ServletFileUpload upload = new ServletFileUpload(factory); // Parse the request try { ListformItems = upload.parseRequest(request); if (formItems != null && formItems.size() > 0) { for (FileItem item : formItems) { if (!item.isFormField()) { String fileName = new File(item.getName()).getName(); String filePath = UPLOAD_DIRECTORY + File.separator + fileName; File storeFile = new File(filePath); // Save the file on server item.write(storeFile); response.getWriter().println("File " + fileName + " has uploaded successfully!"); } } } } catch (Exception ex) { response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "There was an error: " + ex.getMessage()); } } } -
配置web.xml(如果你不使用注解):
<servlet> <servlet-name>FileUploadServletservlet-name> <servlet-class>com.example.FileUploadServletservlet-class> servlet> <servlet-mapping> <servlet-name>FileUploadServletservlet-name> <url-pattern>/uploadurl-pattern> servlet-mapping> -
创建上传表单: 创建一个HTML表单来允许用户上传文件。
html> <html> <head> <title>File Uploadtitle> head> <body> <h1>Upload Fileh1> <form action="upload" method="post" enctype="multipart/form-data"> <input type="file" name="file" /> <input type="submit" value="Upload" /> form> body> html>
文件下载
-
创建Servlet: 创建一个Servlet来处理文件下载请求。
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.FileInputStream; import java.io.IOException; import java.io.OutputStream; @WebServlet("/download") public class FileDownloadServlet extends HttpServlet { private static final long serialVersionUID = 1L; private static final String DOWNLOAD_DIRECTORY = "uploads"; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String fileName = request.getParameter("file"); if (fileName == null || fileName.isEmpty()) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, "File name is required"); return; } String filePath = DOWNLOAD_DIRECTORY + File.separator + fileName; File file = new File(filePath); if (!file.exists()) { response.sendError(HttpServletResponse.SC_NOT_FOUND, "File not found"); return; } response.setContentType("application/octet-stream"); response.setContentLength((int) file.length()); response.setHeader("Content-Disposition", "attachment; filename="" + fileName + """); FileInputStream inStream = new FileInputStream(file); OutputStream outStream = response.getOutputStream(); byte[] buffer = new byte[4096]; int length; while ((length = inStream.read(buffer)) > 0) { outStream.write(buffer, 0, length); } inStream.close(); outStream.flush(); } } -
配置web.xml(如果你不使用注解):
<servlet> <servlet-name>FileDownloadServletservlet-name> <servlet-class>com.example.FileDownloadServletservlet-class> servlet> <servlet-mapping> <servlet-name>FileDownloadServletservlet-name> <url-pattern>/downloadurl-pattern> servlet-mapping> -
创建下载链接: 创建一个HTML页面来允许用户下载文件。
html> <html> <head> <title>File Downloadtitle> head> <body> <h1>Download Fileh1> <a href="download?file=example.txt">Download example.txta> body> html>
通过以上步骤,你可以实现一个基本的文件上传和下载功能。请确保在实际应用中对文件大小、类型等进行适当的验证和处理,以确保安全性和性能。