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();}//设置文件上传上限最大为:100kbupload.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();
