一、文件上传
1.文件上传实现思路
1)稍微复杂一些 直接使用Servlet实现有难度,一般使用apache commons组件中commons-fileUpload组件,大大降低操作的难度。
2)commons-fileUpload离不开commons-io组件
3)commons-fileUpload的常用类
4)FileItemFactory DiskFileItemFactory:工厂类,生产FileItem
5)FileItem:每个表单项都会被封装成一个FileItem对象
6)ServletFileUpload:实现上传操作,将表单数据封装到FileItem中
2.理解上传API的作用
1)添加jar
commons-fileupload.jar
commons-io.jar
![2a53aaa2136f53138053d7042859ac03.png](https://img-blog.csdnimg.cn/img_convert/2a53aaa2136f53138053d7042859ac03.png)
2)视图层注意点
- method="post"
- enctype="multipart/form-data"
- 照片:<input type="file" name="photo">
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'add.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
</head>
<body>
${
requestScope.mess }
<form action="add" method="post" enctype="multipart/form-data" >
用户名:<input type="text" name="name"><br>
年龄:<input type="text" name="age"><br>
分数:<input type="text" name="score"><br>
照片:<input type="file" name="photo"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
3)控制层
FileItem的常用方法
- item.isFormField() 如果是普通表单项 true,如果是file表单项,false
- item.getFieldName() 表单项的name属性
- item.getString() 普通表单项的值,file表单项就是file的内容
- item.getName() 普通表单项就是null,file表单项就是文件的名称
- item.getContentType() 普通表单项是null,file表单项就是文件的类型
- item.getSize():表单项内容长度
package com.bjsxt.servlet;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
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;
public class AddServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//1.创建FileItemFactory对象
FileItemFactory factory = new DiskFileItemFactory();
//2.创建ServletFileUpload对象
ServletFileUpload upload = new ServletFileUpload(factory);
//3.通过ServletFileUpload对象实现上传操作,将客户端一个个表单封装到一个个FileItem中
List<FileItem> itemList = null;
try {
itemList = upload.parseRequest(request);
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//4.遍历各个FileItem
for (int i = 0; i < itemList.size(); i++) {
FileItem item = itemList.get(i);
//输出item的内容,熟悉FileItem的主要方法
System.out.println(item.isFormField());//是否是file表单项 是file false
System.out.println(item.getFieldName());//表单项name的属性值
System.out.println(item.getString());//对于非file表单项,value属性的值;对于file表单项,是文件内容
System.out.println(item.getName());//对于file表单项,上传文件的名称;对于非file表单项,返回null
System.out.println(item.getContentType());//对于file表单项,上传文件mime类型 ;对于非file表单项,返回null
System.out.prin