0
点赞
收藏
分享

微信扫一扫

Day03【Response】综合案例-文件下载


response-综合案例-文件的下载

  • (1)文件的复制
    本质就是将一个文件的所有字节 读出来,再复制到另一个文件中
  • (2)打开网络文件
    浏览器读服务器的文件,本质也是复制
  • (3)下载网络文件
    本质文件复制,不过通过设置响应头,控制浏览器以附件的形式下载

response-综合案例-弹出保存框

如果需要浏览器弹出保存框,则需要通过设置响应头的两个指令

  • Content-Type 设置MIME-Type
  • Content-Disposition 设置附件名称

//指令,调用浏览器弹出下载框,由用户自己保存
response.setHeader("Content-Type", mimeType);
response.setHeader("Content-Disposition", "attachment;filename="+saveName);

response-综合案例-getMimeType方法

  • (1)如何设置附件
    HTTP协议规定,如果一个服务器的文件要以附件的形式下载,必须设置两个响应头
    1:下载文件的类型(MIME类型) 由下载文件的后缀名决定
    tomcat服务器中的web.xml中包含大量的扩展名对应的mime-type的对应关系
    比如 a.jpg 对应的mime类型是 image/jpg

getMimeType(filename) //servletContext对象的方法

2:设置一个头部信息,这个信息用来指定附件下载时,文件的名字

response-综合案例-文件名为中文

1: 如果是非中文的保存名称,浏览器可以正常保存,但如果是中文的话,需要进行先进行URL编码
美女 -----> %ED%AD%AC
2:不同的浏览器转码方式不一样: IE浏览器 火狐浏览器 其他浏览器

public  String getFileName(HttpServletRequest request,String filename) throws UnsupportedEncodingException {
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 {
// 其它浏览器
filename = URLEncoder.encode(filename, "utf-8");
}
return filename;
}

完整下载代码

src\com\wzx\pack05_download\Demo05Servlet.java

@WebServlet("/down")
public class Demo05Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//获取请求参数中的文件名
String filename=request.getParameter("filename");

String saveName=getFileName(request,filename);
//自动根据文件的后缀名得到mime-type类型
String mimeType = getServletContext().getMimeType(filename);
System.out.println(mimeType);
//指令,调用浏览器弹出下载框,由用户自己保存
response.setHeader("Content-Type", mimeType);
response.setHeader("Content-Disposition", "attachment;filename="+saveName);


//1.加载a.jpg文件成为一个输入流
InputStream inputStream = getServletContext().getResourceAsStream("download/"+filename);
//2.再使用字节流 将数据写到浏览器
OutputStream outputStream = response.getOutputStream();
//3.浏览器自动将数据显示成图片
FileService fileService = new FileService();
fileService.copy(inputStream,outputStream);
//4.关闭
outputStream.close();
inputStream.close();
}
public String getFileName(HttpServletRequest request,String filename) throws UnsupportedEncodingException {
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 {
// 其它浏览器
filename = URLEncoder.encode(filename, "utf-8");
}
return filename;
}
}

访问测试
​​​http://localhost:8080/web01_reponse/down?filename=a.txt​

​http://localhost:8080/web01_reponse/down?filename=美女.jpg​


举报

相关推荐

0 条评论