一、获取Commons-FileUpLoad组件jar包

        https://pan.baidu.com/s/1SzU02MdVeAmvBFSxPrv-Xw

将其中的jar包拷贝到WEB-INFO下的lib包中

二、了解方法API

·FileItemFactory接口      实现类:DiskFileIteamFactory

方法名称方法描述
public void setSizeThreshold(int sizeThreshold)设置内存缓冲区的大小
Public void setResponsitoryPath(String path)设置临时文件存放的目录

 

FileIteam接口的常用方法

方法名称方法描述
public boolean isFormField()判断FileIteam对象封装的数据类型(普通表单返回true,文件表单返回false)
public String getName()获得文件上传字段中的文件名(普通表单字段返回null)
public String getFieldName()返回表单字段元素的name属性值
public void write()将FileItem对象中保存的主体内容保存到指定的文件中
public String getString()将FileItem对象中保存的主体内容以一个字符串返回。其重载方法public String getString(String encoding)中的参数用指定的字符集编码方式 public long getSize() 返回单个上传文件的字节数

ServletFileUpload类的常用方法

方法名称方法描述
public void setSizeMax(long sizeMax)设置请求信息实体内容的最大字节数
public List parseRequest (HttpServletRequest reg)解析form表单中的每个字符的数据,返回一个FileItem对象集合
public static final boolean isMultipartContent(HttpServletRequest  reg)判断请求信息中的内容是否是multipart/form-data类型
public void setHeaderEncoding(String encoding)设置转换时所使用的字符集编码
public ServletFileUpload(FileItemFactory Factory)创建控制上传的核心类型实例

三、编写form表单:

·注意要设置表单的enctype属性enctype="multipart/form-data"

·且表单中要使用File空间选择文件<input type="file" name="userImage">

·注意:上传文件时form标签的method属性必须为post,不能为get

<form action="upload.jsp" method="post" enctype="multipart/form-data">
	用户名:<input type="text" name="userName">
	用户图片:<input type="file" name="userImage">
	<input type="submit" value="提交">
</form>

四、编写上传文件处理页的实现步骤

  1. 创建FileItemFactory对象
  2. 创建ServletFileUpLoad对象
  3. 解析form表单提交的所有表单元数据

           (1)如果是普通表单元素 

                          `获取该元素的名和值使用

             (2)如果是文件数据

                          ·获取文件名的参数

                          ·保存文件数据到服务器

以下为JSP代码:

 <%
//创建FileItem工厂   作用:生产fileItem  原料:http提交上来的请求
	FileItemFactory factory = new DiskFileItemFactory();
	//将factory 工厂用ServletFileUpload 进行实例化,封装进upload中
	ServletFileUpload upload = new ServletFileUpload(factory);
	//静态方法isMultipartContent:判断提交来的数据是否为文件上传的表单,返回值是boolean
	boolean isMultipart= ServletFileUpload.isMultipartContent(request);

	if(isMultipart){
		//**如果是上传文件的类型

		//获取FileItem集合,由upload接收数据。此时items集合中应该会受到两条数据,一条是用户名username,一条是用户图片userimage
		List<FileItem> items = upload.parseRequest(request);
		//可用集合size()方法打印测试一下,结果为2
		out.print("size>>>"+items.size());

		//获取完item后,要遍历items 集合
		for(FileItem item:items){
			//确定是否是文件组件,isFormField来判断是否为一个普通的form表单,返回值为boolean类型
			boolean isFormField =item.isFormField();
			if(isFormField){
			//如果只是普通的form表单:正常处理(此处打印name和value值)
			//注意获取普通组件名称使用:如果只是一般的组件,获取名称要用getFieldName(),而不能使用getName(),
			String name = item.getFieldName();
			String value = item.getString();
			out.print("<br>name>>>>"+name+"<br>value>>>>"+value);
			}else{
				//**如果是文件上传的form表单

			//此时这个项目是在webapp文件夹里面运行,而jsp运行的java代码是在work文件夹里,最终打包给webapp运行。
			//在本项目下创建一个包接收文件,取名upload(所以此路径应该去webapp里找)
			 String SavePath = application.getRealPath("upload");
			 String FileName = item.getName(); //获取文件名称
			//创建IO流,保存文件
			 File file = new File(SavePath+"/"+FileName);
			 item.write(file);
			 out.print("保存成功");
			}
		}

	}else{
	//如果不是上传文件的类型
		out.print("非法文件上传");
	}
%>

五、控制文件上传的大小限制

用upload.setSizeMax();方法,里面跟的单位是byte,除以1024得到kb

<%
//设置上传文件的最大字节30KB
	upload.setSizeMax(30*1024);
try{
    //省略以上第四步的代码……
}catch(FileUploadBase.SizeLimitExceededException e){
	e.printStackTrace();
	out.print("文件太大,无法上传!最大限制为"+upload.getSizeMax()/1024+"kb!");
}
%>

 

六、关于字符编码的问题

如果在jsp界面一开始设置字符编码request.setCharacterEncoding(“utf-8”)

最终控制台打印的依然是乱码

是因为List<FileItem> items = upload.parseRequest(request);这一步中将request已经转好码的字符集又转化为FileItem集合,转化为FileItem时,又选取了另外一种编码格式,所以数据会出现乱码

解决办法:getString()方法中可以设置编码

String value = item.getString("utf-8");

另外:

在upload文件下下保存好的文件名会出现乱码,此时需要在一开始添加upload.setHeaderEncoding("utf-8");

 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐