servlet实现文件上传和下载
### Servlet 实现文件上传与下载 #### 一、概述 在Web开发中,文件的上传与下载是非常常见的功能需求。本文将详细介绍如何使用Servlet技术来实现文件的上传和下载功能,而不依赖于任何第三方框架。这不仅有助于理解HTTP协议的工作原理,同时也能够提升对Java Web开发底层机制的理解。 #### 二、Servlet简介 Servlet是一种运行在服务器端的小程序,主要用于处理客户端发送来的HTTP请求,并返回相应的响应结果。Servlet是Java Web开发的基础技术之一,它提供了构建动态Web应用的强大能力。通过Servlet可以处理各种类型的请求,包括但不限于HTML页面请求、表单提交等。本文中的示例将展示如何使用Servlet来处理文件上传和下载的请求。 #### 三、技术选型 为了实现文件的上传与下载,本文选择了以下技术栈: - **Servlet**:用于接收HTTP请求并作出响应。 - **Commons FileUpload**:这是一个Apache提供的开源库,专门用于处理文件上传相关的操作。 - **Commons IO**:另一个Apache的开源库,提供了一系列用于处理文件输入输出操作的工具类。 #### 四、实现细节 ##### 1. 文件上传 文件上传通常涉及到HTTP POST请求,其中包含了文件数据和其他表单字段。为了正确解析这些数据,我们需要使用`ServletFileUpload`类来处理请求。 - **配置web.xml** ```xml <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <servlet> <servlet-name>fileLoad</servlet-name> <servlet-class>com.lhs.FileLoad</servlet-class> </servlet> <servlet-mapping> <servlet-name>fileLoad</servlet-name> <url-pattern>/fileLoad</url-pattern> </servlet-mapping> </web-app> ``` - **编写Servlet(FileLoad.java)** ```java 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("/fileLoad") public class FileLoad extends HttpServlet { private static final String UPLOAD_DIRECTORY = "uploadDir"; @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 文件保存路径 String uploadPath = getServletContext().getRealPath("") + File.separator + UPLOAD_DIRECTORY; new File(uploadPath).mkdirs(); try { List<FileItem> fileItems = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request); for (FileItem item : fileItems) { if (!item.isFormField()) { item.write(new File(uploadPath + File.separator + item.getName())); } } response.sendRedirect("success.jsp"); } catch (Exception e) { response.sendRedirect("error.jsp"); } } } ``` ##### 2. 文件下载 文件下载可以通过响应流将文件数据发送回客户端。为了实现这一点,我们需要创建一个用于处理文件下载请求的Servlet。 - **配置web.xml** ```xml <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <servlet> <servlet-name>fileDown</servlet-name> <servlet-class>com.lhs.FileDown</servlet-class> </servlet> <servlet-mapping> <servlet-name>fileDown</servlet-name> <url-pattern>/fileDown</url-pattern> </servlet-mapping> </web-app> ``` - **编写Servlet(FileDown.java)** ```java 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.FileInputStream; import java.io.IOException; import java.io.OutputStream; @WebServlet("/fileDown") public class FileDown extends HttpServlet { private static final String DOWNLOAD_DIRECTORY = "uploadDir"; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String fileName = request.getParameter("filename"); String downloadPath = getServletContext().getRealPath("") + File.separator + DOWNLOAD_DIRECTORY + File.separator + fileName; FileInputStream fileInputStream = new FileInputStream(downloadPath); response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\""); OutputStream outStream = response.getOutputStream(); byte[] buffer = new byte[4096]; int bytesRead = -1; while ((bytesRead = fileInputStream.read(buffer)) != -1) { outStream.write(buffer, 0, bytesRead); } fileInputStream.close(); outStream.close(); } } ``` #### 五、总结 本文介绍了如何使用Servlet实现文件的上传与下载功能。我们配置了web.xml文件来映射Servlet。然后,使用Commons FileUpload和Commons IO库来处理文件上传的过程。实现了文件下载的功能,通过设置响应头来控制浏览器的行为。这种方法简单明了,适用于不需要框架支持的轻量级项目。
- 粉丝: 51
- 资源: 8
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 风储调频,风调频,同步机调频 有视频,有文献 simulink风储调频,风电分风速调频,有低中高三个风速段,风储联合调频,改善系
- 08背靠背变器,PQ-QV控制,有名值,simulink仿真模型,2022b版本 ①其他模型看我主页,都是个人搭建,无团队 ②变
- qpcr数据处理,只需替换目标CT值,秒出结果,节约时间
- 基于matlab实现改进的人工势场法,apf算法进行路径规划,通过改进斥力函数和引入模拟 火算法,克服局部极小值和目标不可达问题
- 基于LSTM-AdaBoost长短期记忆网络结合AdaBoost多输入单输出回归预测 python代码 1.输入多个特征,输出
- 事件触发,微电网分层下垂控制 有应用图中文献算法的matlab仿真模型
- 多项式曲线拟合,c代码,可实现1阶线性,2-4阶多项式曲线拟合,代码注释详细,方便移植,书写规范 图片有现场拟合参数的1-4阶的
- 基于深度混合核极限学习机DHKELM的回归预测,优化算法采用的是北方苍鹰NGO,可替成其他方法
- 双馈电机三矢量模型预测控制
- 基于SAP SPRO功能的HTML设计源码