文件的上传和下载,是非常常见的功能。很多的系统中,或者软件中都经常使用文件的上传和下载。 比如:QQ 头像,就使用了上传;邮箱中也有附件的上传和下载功能;OA 系统中审批有附件材料的上传
一、文件上传
(一)步骤
- 要有一个 form 标签,
method=post
请求 - form 标签的 enctype 属性值必须为
multipart/form-data
值 - 在 form 标签中使用
input type=file
添加上传的文件 - 编写服务器代码(Servlet 程序)接收,处理上传的数据。
enctype=multipart/form-data
表示提交的数据,以多段(每一个表单项一个数据段)的形式进行拼接,然后以二进制流的形式发送给服务器。
(二)文件上传中HTTP 协议的说明
upload.jsp:
Servlet:
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class UploadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("文件上传过来了");
}
}
web.xml:
<servlet>
<servlet-name>UploadServlet</servlet-name>
<servlet-class>com.fox.servlet.UploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UploadServlet</servlet-name>
<url-pattern>/uploadServlet</url-pattern>
</servlet-mapping>
谷歌浏览器按F12,点击Network查看请求体和请求体:
(三)Servlet解析上传的文件
上面我们只是简单地完成了文件上传的步骤,还没有在Servlet中解析上传的文件
要想完整实现文件上传,我们需要用到commons-fileupload.jar包,而commons-fileupload.jar 需要依赖 commons-io.jar 这个包,所以两个包我们都要引入(可以在Maven仓库搜索下载)。
1.commons-fileupload.jar 常用 API 介绍说明
commons-fileupload.jar 中,我们常用的类和方法有哪些?
- ServletFileUpload 类,用于解析上传的数据。
public static final boolean isMultipartContent(HttpServletRequest request)
判断当前上传的数据格式是否是多段的格式。public List<FileItem> parseRequest(HttpServletRequest request)
解析上传的数据
- FileItem 类,表示每一个表单项。
boolean isFormField()
判断当前这个表单项,是普通的表单项(true);还是上传的文件类型(false)String getFieldName()
获取表单项的 name 属性值String getString()
获取当前表单项的value 属性值。String getName()
获取上传的文件名void write( file )
将上传的文件写到 参数 file 所指向的硬盘位置
2.文件上传的最终实现
upload.jsp和web.xml还是和上面一样
Servlet:
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet