文件上传需要注意:
- 提交方式:post
- 表单中有文件上传的表单项:
- 指定表单类型:
默认类型:enctype="application/x-www-form-urlencoded"
文件上传类型:multipart/form-data
可以使用开源的文件上传组件-Apache提供的文件上传组件-FileUpload组件!
FileUpload组件:
1. 下载源码
2. 项目中引入jar文件
commons-fileupload-1.2.1.jar 【文件上传组件核心jar包】
commons-io-1.4.jar 【封装了对文件处理的相关工具类】
文件上传组件API
|--FileIteamFactory 文件上传工厂类(把每个请求表单封装为一个个FileIteam对象)
fac.setRepository( repository ) 设置删除临时目录
|--ServletFileUpload 文件上传核心类:可以获取所有的FileIteam对象
List parseRequest( response ); 获取所有文件上传项
Boolean isMultipartContent( request ) 判断表单类型,文件上传表单,返回true
upload.setFileSizeMax( fileSizeMax ); 设置单个文件的最大值
upload.setSizeMax( sizeMax ); 设置总文件的大小
upload.setHeaderEncoding("utf-8"); 设置上传文件名的编码
相当于 request.setCharacterEncoding(...);
|--FileIteam 封装了普通表单项的值以及文件上传表单的值
item.getFildName() 获取上传表单名称
item.getString() 获取上传数据
item.getString( "utf-8" ) 获取上传数据,处理中文
item.getContentType() 获取上传文件类型【文件项】
item.getInputStream() 获取文件流【文件项】
item.getName() 获取文件名【文件项】
item.write(file) 写文件
item.delete( ) 删除临时文件
文件上传处理类
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1、创建文件上传工厂类
FileItemFactory fac = new DiskFileItemFactory();
// 2、创建文件上传核心类对象
ServletFileUpload upload = new ServletFileUpload(fac);
// 设置
// 设置单个文件大小
upload.setFileSizeMax(30*1024*1024);
// 设置总文件大小
upload.setSizeMax(50*1024*1024);
// 3、判断当前表单是否为文件时上传表单
if(upload.isMultipartContent(request)){
try{
// 3、把请求数据转换为FileItem对象的集合
List<FileItem> list = upload.parseRequest(request);
// 遍历得到每一个上传项
for(FileItem item:list){
// 判断是普通表单还是文件上传表单
if(item.isFormField()){
// 普通表单
String fieldName = item.getFieldName(); // 文本框名称
String contentType = item.getContentType(); // 文件类型
String str = item.getString(); // 文本框中的值
}else{
// 文件上传表单
String fieldName = item.getFieldName(); // 文本框名称
String contentType = item.getContentType(); // 文件类型
String name = item.getName(); // 文件名
String str = item.getString(); // 文件中的值
InputStream in = item.getInputStream(); // 文件流
System.out.println(fieldName+":"+name);
System.out.println(in);
// 获取文件上传路径
String path = this.getServletContext().getRealPath("/upload");
File file = new File(path, name);
item.write(file);
// 删除临时文件
item.delete();
}
}
}catch(Exception e){
}
}
}
文件下载
文件下载时:
1、需要把文件从硬盘以流的方式读入;
2、设置相应头为文件下载
response.setHeader("content-disposition", "attachment;fileName=" + fileName)
3、然后获取response输出流response.getOutputStream
,将文件流写入输出流,
注意乱码问题
tomcat默认使用http协议,数据默认传输是使用的是ISO-8859-1编码,上传时文件名存在于post提交的数据中,所以可以使用request.setCharacterEncoding("utf-8")
;来指定编码格式。
下载时
提交下载的文件名是通过get数据提交的,get数据放在url中,URL使用的编码时ISO-8859-1编码,所以拿到文件名时要进行编码转换
fileName = new String(fileName.getBytes("iso-8859-1"),"utf-8");
下载时需要设置下载的响应头,下载响应头传输时默认使用的是ISO-8859-1编码
// 设置下载的响应头
resp.setHeader("content-disposition", "attachment;fileName=" + fileName);
如果有中文需要转码
// 如果文件名是中文,需要进行url编码
// 使用指定的编码机制将字符串转换为 application/x-www-form-urlencoded 格式。
fileName = URLEncoder.encode(fileName, "UTF-8");
或者使用
fileName = new String(fileName.getBytes("utf-8"),"iso-8859-1");