使用commons-fileupload组件实现Java JSP文件上传与下载

2星 需积分: 14 18 下载量 87 浏览量 更新于2024-07-24 收藏 21KB DOCX 举报
"使用Java实现文件上传和下载,重点关注Apache Commons FileUpload组件的使用方法" 在Web应用程序中,文件上传和下载是常见的功能需求。对于基于Java的JSP环境,实现这些功能并不复杂,得益于众多开源组件的支持。Apache Commons FileUpload组件就是其中的一个,它为Java开发者提供了强大的文件上传能力。 Apache Commons FileUpload是Apache Jakarta组织的一个项目,可以在其官方网站(http://jakarta.apache.org/commons/fileupload/)上获取。这个组件允许开发者处理HTTP请求中的多部分表单数据,从而支持一次上传一个或多个文件。使用时,需要将`commons-fileupload-1.0.jar`库文件添加到项目的类路径中,比如放到Tomcat服务器的`WEB-INF/lib`目录下。 为了实现文件上传,首先需要创建一个Servlet,例如名为`Upload`的Servlet。以下是一个简单的`Upload`Servlet的示例: ```java import java.io.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; import org.apache.commons.fileupload.*; public class Upload extends HttpServlet { private String uploadPath = "C:/upload"; // 上传文件的目录 private String tempPath = "C:/uploadtmp"; // 临时文件目录 public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { try { DiskFileUpload fu = new DiskFileUpload(); // 设置最大文件尺寸,这里是4MB fu.setSizeMax(4194304); // 设定临时存储目录 fu.setRepositoryPath(tempPath); // 处理上传请求 List<FileItem> items = fu.parseRequest(request); for (FileItem item : items) { if (!item.isFormField()) { String fileName = new File(item.getName()).getName(); File storeFile = new File(uploadPath + File.separator + fileName); item.write(storeFile); // 可在此处添加其他处理逻辑,如保存文件信息到数据库等 } } } catch (FileUploadException e) { e.printStackTrace(); } } } ``` 在`doPost`方法中,`DiskFileUpload`实例用于解析请求中的文件项。通过设置`setSizeMax`可以限制上传文件的大小,以防止过大文件导致服务器问题。`setRepositoryPath`定义了临时文件的存储位置,`parseRequest`方法解析请求并返回一个`FileItem`列表。对于每个非表单字段的`FileItem`(即实际的文件),可以调用`write`方法将其写入指定的存储路径。 至于文件下载,可以通过Servlet提供HTTP响应,包含文件内容并设置合适的MIME类型和文件名。以下是一个基本的文件下载Servlet片段: ```java public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { String filePath = "C:/upload/somefile.txt"; File file = new File(filePath); if (file.exists()) { response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment; filename=\"" + file.getName() + "\""); FileInputStream fis = new FileInputStream(file); byte[] buffer = new byte[1024]; int length; while ((length = fis.read(buffer)) > 0) { response.getOutputStream().write(buffer, 0, length); } fis.close(); } else { response.getWriter().println("文件不存在!"); } } ``` 这段代码设置了响应类型为二进制流,以便浏览器将其作为文件下载。`Content-Disposition`头用于指定附件名称,然后读取文件内容并逐块写入响应输出流。 Apache Commons FileUpload组件极大地简化了Java Web应用中的文件上传处理,而文件下载则主要通过Servlet的HTTP响应机制来实现。通过合理的代码设计和错误处理,可以构建稳定可靠的文件上传下载功能。