No Pain No Gain
文件上传
三要素:
- 表单提交方式为post
- 表单中需要文件上传项
- enctype=multipart/form-data
核心解析类:ServletFileUpload
parseRequest(HttpServletRequest req); // 解析请求,并获取相关文件项
setHeaderEncoding(String encoding); // 解决中文文件名乱码问题
文件项:FileItem
boolean isFormField(); // 返回为true,普通字段。返回为false,就是文件
String getField(); // 获取表单字段
String getString(String encoding); // 根据指定编码格式获取字段值
String getName(); // 获取上传文件名称
InputStream getInputStream(); // 获取上传文件对应的输入流
代码实现:
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
try {
List<FileItem> fileItems = servletFileUpload.parseRequest(request);
for (FileItem fileItem : fileItems) {
if (fileItem.isFormField()){
String desc = fileItem.getString();
}else {
InputStream inputStream = fileItem.getInputStream();
BufferedInputStream bis = new BufferedInputStream(inputStream);
String contextPath = request.getServletContext().getRealPath("upload");
File contextFile = new File(contextPath);
if (!contextFile.exists()){
contextFile.mkdir();
}
String path = contextPath+File.separator+fileItem.getName();
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(path));
byte[] bys = new byte[8192];
int len = ‐1;
while((len = bis.read(bys)) != ‐1){
bos.write(bys,0,len);
}
bis.close();
bos.close();
}
}
} catch (Exception e) {}
文件下载
TCP协议+IO
手动编写代码实现下载:
- 设置媒体类型
- 设置下载窗口
- 开始读写
String fileName = "aaa.txt";
String realPath = request.getServletContext().getRealPath("/download" + File.separator + fileName);
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(realPath));
//设置媒体类型
response.setContentType(request.getServletContext().getMimeType(fileName));
//设置下载窗口
response.setHeader("Content‐Disposition","attachement;filename=" + fileName);
byte[] bys = new byte[8192];
int len = ‐1;
BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
//开始读写
while((len = bis.read(bys)) != ‐1){
bos.write(bys,0,len);
}
// 关闭流
bis.close();
bos.close();
解决下载文件名中乱码问题
设置窗口中的文件名称
String newFileName = null;
String userAgent = request.getHeader("User‐Agent");
if("Chrome".equals(userAgent)){
//谷歌
newFileName = URLEncoder.encode(fileName, "utf‐8");
}else {
newFileName = base64EncodeFileName(fileName);
}
//设置下载窗口
response.setHeader("Content‐Disposition","attachement;filename="+newFileName);
//base64编码
public String base64EncodeFileName(String fileName) {
BASE64Encoder base64Encoder = new BASE64Encoder();
try {
return "=?UTF‐8?B?" + new String(base64Encoder.encode(fileName .getBytes("UTF‐8"))) + "?=";
} catch (Exception e) {
e.printStackTrace(); throw new RuntimeException(e);
}
}