day15_文件上传&文件下载
文件上传
1. 实现文件上传思路
准备
表单
- method=”post”
- enctype=”multipart/form-data”
- type=”file”
两个jar包
- commons-fileupload.jar
- commons-io.jar
代码
- 创建DiskFileItemFactory对象,为创建解析器做准备。
- 创建ServletFileUpload解析器,调用parseRequest()方法,将request对象,解析为List
- 调用FileItem中isFormField(),查找文件参数
- 调用FileItem中writer()方法,实现文件上传
2. 实现文件上传示例代码
response.setContentType("text/html;charset=UTF-8");
//1. 创建DiskFileItemFactory对象,为创建解析器做准备。
DiskFileItemFactory factory = new DiskFileItemFactory();
//2. 创建ServletFileUpload解析器,
ServletFileUpload upload = new ServletFileUpload(factory);
//调用parseRequest()方法,将request对象,解析为List<FileItem>
//获取upload真实路径
String realPath = getServletContext().getRealPath("/upload");
//优化【文件不存在时自动创建】问题
File fPath = new File(realPath);
if(fPath.exists()==false){
fPath.mkdir();
}
//设置文件上传上限最大为:100kb
upload.setFileSizeMax(102400);
try {
List<FileItem> fileItems = upload.parseRequest(request);
for (FileItem fileItem : fileItems) {
//3. 调用FileItem中isFormField(),查找文件参数
if(fileItem.isFormField() == false){
String fName = fileItem.getName();
String uuid = UUID.randomUUID().toString().replace("-", "");
//文件参数,4. 调用FileItem中writer()方法,实现文件上传
File file = new File(realPath+File.separator+uuid+fName);
fileItem.write(file);
}else{
//普通参数
}
}
response.getWriter().write("文件上传成功!");
} catch (FileUploadBase.FileSizeLimitExceededException e) {
response.getWriter().write("文件最大为100kb!");
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}
3. 实现文件下载思路
- 准备下载资源
- 创建输入流【FileInputStream】
- 获取输出流【ServletOutputStream】
- 边读边写
4. 实现文件下载代码
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
//获取下载资源文件名
String fileName = request.getParameter("fileName");
//获取文件本地真实路径
String realPath = getServletContext().getRealPath("/WEB-INF/download/" + fileName);
System.out.println("realPath = " + realPath);
File file = new File(realPath);
//创建输入流【FileInputStream】
FileInputStream fis = new FileInputStream(file);
//边读边写【设置】
//设置浏览器响应体文件类型
String mimeType = request.getServletContext().getMimeType(fileName);
response.setContentType(mimeType);
//解决文件名中文乱码问题
String header = request.getHeader("User-Agent");
if(header != null && header.contains("Firefox")) {
fileName = "=?utf-8?B?"+new BASE64Encoder().encode(fileName.getBytes("utf-8"))+"?=";
}else {
fileName = URLEncoder.encode(fileName, "UTF-8");
}
//设置浏览器响应体内容格式,为附件格式。(告诉浏览器,文件为附件,别打开,下载。)
response.setHeader("Content-Disposition", "attachment; filename="+fileName);
//获取输出流【ServletOutputStream】
ServletOutputStream ops = response.getOutputStream();
//边读边写
byte[] b = new byte[1024];
int len;
while((len=fis.read(b))>0){
ops.write(b,0,len);
}
ops.close();
fis.close();