文章目录
文件上传
前端页面
必要条件
- 需要有一个form表单
- form表单需要设置以下几个属性:
- action: 提交数据的目的地
- method: 设置post
- enctype: 设置成multipart/form-data
- form里需要至少有一个file域: <input type=“file” name=“xxx” />
后端技术
所谓文件上传其实就是用流的方式,将文件从客户的电脑上通过网页中的表单, 以二进制流的方式,流到服务器的过程。
文件下载就是反过来, 将文件从服务器上通过二进制流的方式流到客户电脑上。
Servlet3.0上传方式
Servlet3.0上传的核心: 一个注解、一个接口
注解:
@MultipartConfig: 开启Servlet文件上传功能
接口:
javax.servlet.http.Part: 封装了上传的文件相关的所有信息
具体操作步骤
- 新建处理文件上传的Servlet,然后重写doPost方法
- 给Servlet添加@MultipartConfig注解,开启文件上传功能
- Part part = request.getPart(“input type=‘type’ name的值”);
- part对象有两个作用:
- 可以获取到上传文件的所有信息,比如:文件名、大小、类型、文件流数据
- 可以直接将文件写到服务器 part.write(“文件保存的路径”);
Apache Commons Fileupload 上传方式
用fileupload上传的核心就是:一个接口、两个类
接口: FileItem
封装了我们表单中的每个域的数据(可能是普通文本数据,也可能是上传的文件)
类:
DiskFileItemFactory: 用于创建文件上传对象的工厂
ServletFileupload: 文件上传对象
具体操作步骤
-
需要添加依赖: commons-fileupload.jar、commons-io.jar
-
新建处理文件上传的Servlet,然后重写doPost方法
-
调用ServletFileupload对象的静态方法,判断请求是否是一个文件上传请求
if(!ServletFileupload.isMultipartContent(request)) { // 如果不是multipart请求,代表不是一个有效的文件上传请求, 下面的步骤都可以省略了 }
-
创建文件上传工厂对象:
DiskFileItemFactory factory = new DiskFileItemFactory(); // factory.set.... 可以设置相关参数
-
创建文件上传对象
ServletFileupload upload = new ServletFileupload(factory); // upload.set.... 可以设置相关参数
-
用文件上传对象解析请求对象,然后获取解析后的所有FileItem
List<FileItem> fileItems = upload.parseRequest(request);
-
迭代处理每个FileItem
- 文本信息的FileItem获取后进行相关的业务操作
- 文件类型的FileItem获取后,调用FileItem.write将文件写到服务器某个目录下。