本系列博客汇总在这里:文件上传下载汇总汇总
一、commons-fileupload
1、上传文件的要求
- 必须是 post 表单;
- 表单的 enctype 必须是 multipart/form-data;
- 在表单中添加 file 表单字段,即
<input type=”file”…/>
。
2、Servlet 的要求
- 不能再使用
request.getParameter()
来获取表单数据; - 可以使用
request.getInputStream()
得到所有的表单数据,而不是一个表单项的数据; - 这说明不使用 fileupload,我们需要自己来对
request.getInputStream()
的内容进行解析!!!
fileupload 是由 apache 的 commons 组件提供的上传组件。它最主要的工作就是帮我们解析 request.getInputStream()
。
fileupload 组件需要的 JAR 包有:
- commons-fileupload.jar,核心包;
- commons-io.jar,依赖包。
fileupload 的核心类有:DiskFileItemFactory、ServletFileUpload、FileItem。
使用 fileupload 组件的步骤如下:
- (1)创建工厂类 DiskFileItemFactory 对象:
DiskFileItemFactory factory = new DiskFileItemFactory();
- (2)使用工厂创建解析器对象:
ServletFileUpload fileUpload = new ServletFileUpload(factory);
- (3)使用解析器来解析 request 对象:
List<FileItem> list = fileUpload.parseRequest(request);
隆重介绍 FileItem 类,它才是我们最终要的结果。一个 FileItem 对象对应一个表单项(表单字段)。一个表单中存在文件字段和普通字段,可以使用 FileItem 类的 isFormField()
方法来判断表单字段是否为普通字段,如果不是普通字段,那么就是文件字段了。
-
String getName()
:获取文件字段的文件名称。 -
String getString()
:获取字段的内容,如果是文件字段,那么获取的是文件内容,当然上传的文件必须是文本文件。 -
String getFieldName()
:获取字段名称,例如:<input type="text" name="username"/>
,返回的是username。 -
String getContentType()
:获取上传的文件的类型,例如:text/plain。 -
Long getSize()
:获取上传文件的大小。 -
boolean isFormField()
:判断当前表单字段是否为普通文本字段,如果返回 false,说明是文件字段。 -
InputStream getInputStream()
:获取上传文件对应的输入流。 -
void write(File)
:把上传的文件保存到指定文件中。
1、编写 jsp 页面 upload.jsp。注意表单必须是 post 的,而且 enctype 必须是 mulitpart/form-data 的。
2、编写 servlet(FileUploadServlet) 。
3、在 web.xml 文件中部署。
4、访问请求(http://localhost:8080/file_upload1/upload.jsp)页面 upload.jsp 查看效果。
如果需要本文当中涉及的完整代码,请下载汇总处的项目文件。
如有错误,欢迎指正!