文件上传与下载、监听器、过滤器
A.文件上传
1.概述
将客户端的文件,保存到服务端
2.对表单的限制
表单属性enctypr必须为:multipart/form-data
ecctypr:指表单发送数据的编码方式
appliaction/x-www-form-urlencoded:数据进行URL编码
text/plain:纯文本发送
multipart/form-data:可以发送二进制数据,专门用于文件上传
提交的方式必须为post
3.前端网页
<body> <form action="${ pageContext.request.contextPath }/upload" method="post" enctype="multipart/form-data"> <input type="file" name="myfile" /> <input type="submit" value="上传" /> </form> </body>
4.后台
使用commons-fileupload组建解析消息
在WebRoot下创建文件夹接收文件,并导入jar包
对Servlet限制
a.request.getParameter()不能使用,即使用了也获取的是null
b.使用request.getInputStream()来获取所有消息体数据,然后解析
5.步骤代码
package org.xxxx.demo; import java.io.File; import java.io.IOException; import java.util.List; import java.util.UUID; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; public class UpLoadServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { // 设置编码 request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); // 创建工厂对象 DiskFileItemFactory factory = new DiskFileItemFactory(); // 创建文件上传对象 ServletFileUpload upload = new ServletFileUpload(factory); // 获取表单对象 List<FileItem> files = upload.parseRequest(request); // 遍历表单对象 for (FileItem f : files) { // 半段文本框类型 if (f.isFormField()) { // 普通文本框,获取键和值 String name = f.getName(); String value = f.getString("utf-8"); System.out.println(name + "---" + value); } else { // 是文件文本框 // 获取文本框名 String fieldName = f.getFieldName(); // 获取文件名 String fileName = f.getName(); // 让文件名随机变化,防止上传相同的文件被覆盖 fieldName = UUID.randomUUID().toString().replaceAll("-", "") + fieldName; // 获取文件大小 long size = f.getSize(); // 获取文件类型 String type = f.getContentType(); System.out.println(fieldName + "=" + fileName + "=" + size + "=" + type); // 把文件上传到服务器端 // 获取真实路径 String realPath = this.getServletContext().getRealPath("/UpLoad"); // 封装 File file = new File(realPath, fileName); // 写入文件 f.write(file); } } } catch (FileUploadException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }
6.结果
启动服务器
选择文件上传
查看服务器路径webapps/工程名/UpLoad
B.文件的下载
1.概述
服务器端保存到客户端
请求下载是GET请求
注意:注意中文乱码的问题
每个浏览器的编码格式不同
所以要针对不同浏览器进行解码
尽量用英文
中文部分浏览器解决方式(在这就不掩饰)
// 获取浏览器的版本信息,根据不同的浏览器,发送不同的数据(文件名称) String agent = request.getHeader("user-agent"); if (agent.contains("MSIE")) { // IE浏览器 filename = URLEncoder.encode(filename, "utf-8"); filename = filename.replace("+", " "); } else if (agent.contains("Firefox")) { // 火狐浏览器 BASE64Encoder base64Encoder = new BASE64Encoder(); filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?="; } else if (agent.contains("Chrome")) { // google浏览器 filename = URLEncoder.encode(filename, "utf-8"); } else { // 其它浏览器 filename = URLEncoder.encode(filename, "utf-8"); }
2.创建文件
3.前台网页
<body> <a href="${ pageContext.request.contextPath }/down?filename=abc.txt">点击下载</a> </body>
4.后台
package org.xxxx.demo; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.io.IOUtils; public class DownLoadServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取文件名 String filename = request.getParameter("filename"); // 获取绝对路径 String realPath = this.getServletContext().getRealPath("/download"); // 封装文件 File file = new File(realPath, filename); // 告诉浏览器弹框,让用户选择保存 response.setHeader("content-disposition", "attachment;filename=" + filename); // 告诉浏览器文件类型 response.setHeader("content-type", this.getServletContext().getMimeType(filename)); // 获取流 FileInputStream in = new FileInputStream(file); ServletOutputStream out