Commons-FileUpLoad的使用详情及其乱码解决办法
一、获取Commons-FileUpLoad组件jar包https://pan.baidu.com/s/1SzU02MdVeAmvBFSxPrv-Xw将其中的jar包拷贝到WEB-INFO下的lib包中二、了解方法API·FileItemFactory接口实现类:DiskFileIteamFactory方法名称方法描述public vo...
一、获取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>
四、编写上传文件处理页的实现步骤
- 创建FileItemFactory对象
- 创建ServletFileUpLoad对象
- 解析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");
更多推荐
所有评论(0)