1 文件的上传介绍
要有一个form标签,method=post请求
form标签的encType属性值必须为multipart/form-data值
在form标签中使用input type=file添加上传的文件
编写服务器代码接受处理上传的数据
http协议解释:
![](https://i-blog.csdnimg.cn/blog_migrate/6357525d2e0b53083c97be94dcf2e3b9.png)
1.2 commons-fileupload.jar常用API说明
第一步:需要导入两个jar包
commons-fileupload-1.2.1.jar
commons-io-1.4.jar
常用类
ServletFileUpload类,用于解析上传的数据
FileItem类,表示每一个表单项
boolean ServletFileUpload.isMultipartContent(HttpServletRequest request);
判断当前上传的数据格式是否是多段的格式
public List<FileItem> parseRequest(HttpServletRequest);
解析上传的数据
boolean FileItem.isFormField()
判断当前这个表单项,是否是普通的表单项,还是上传的文件类型
true表示普通类型
false表示上传的文件类型
String FileItem.getFieldName()
获取表单项的name属性值
String FileItem.getString()
获取当前表单项的值
String FileItem. getName();
获取上传的文件名
void FileItem.write(file);
将上传的文件写到file位置
1.3 FileUpload类库的使用
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
FileItemFactory fileItemFactory = new DiskFileItemFactory();
ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);
request.setCharacterEncoding("utf-8");
try {
List<FileItem> list = servletFileUpload.parseRequest(request);
for (FileItem fileItem : list) {
if (fileItem.isFormField()) {
// 普通
System.out.println("name:" + fileItem.getFieldName());
System.out.println("属性值:"+fileItem.getString("UTF-8"));
} else {
// 文件
System.out.println("name:" + fileItem.getFieldName());
System.out.println("属性值:"+fileItem.getName());
fileItem.write(new File("e:\\" + fileItem.getName()));
}
}
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
3 文件下载
String fileName = "pic1.jpg";
ServletContext servletContext = getServletContext();
String type = servletContext.getMimeType("/file/" + fileName);
System.out.println("文件类型是:" + type);
response.setContentType(type);
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
InputStream inputStream = servletContext.getResourceAsStream("/file/" + fileName);
ServletOutputStream outputStream = response.getOutputStream();
IOUtils.copy(inputStream, outputStream);
如何解决谷歌和ie浏览器中文下载名乱码的问题
方案一:url编码:
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
改成
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("中国.jpg", "UTF-8"));
方案二:BASE64编解码解决(Firefox浏览器)
=? charset?B?xxxxx?=是什么意思?
=? 表示编码内容的开始
charset 字符集
B BASE64编码
xxxxx 表示文件名
?=表示编码内容的结构
方案三:任意浏览器解决编码问题
如果火狐使用Base64编码
如果不是火狐使用URL
tips:现在已经基本上没有区别,url都行