下载

来源:互联网 发布:姚劲波的域名 编辑:程序博客网 时间:2024/04/30 05:53
把一个文件转换成字节数组,使用response.getOutputStream()传递给浏览器
2个响应头
Content-Type:文件的MIME类型
-调用ServletContext的getMimeType(文件名称),得到MIME类型
Content-Disposition:默认为inline(在浏览器中打开)attachment;filename=xxx
-在filename=后面跟随的显示在下载框中的文件名称
1个响应体(下载流)
=================
注意
====
显示在下载框中的文件名如果为中文,会出现乱码
浏览器使用的编码
*FirFox:Base64编码
*其他:URL编码

解决方案:

package com.web.servlet;import java.io.FileInputStream;import java.io.IOException;import java.io.PrintWriter;import java.net.URLEncoder;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;import sun.misc.BASE64Encoder;public class DonwloadServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String filename = "D:/CloudMusic/岸部眞明 - 流れ行く云.mp3";        //解决显示乱码问题String framename = filenameEncoding("岸部眞明 - 流れ行く云.mp3", request);//获取文件MIME类型String contentType = this.getServletContext().getMimeType(filename);String contentDisposition = "attacment;filename="+framename;//输入流FileInputStream input= new FileInputStream(filename);//设置头response.setHeader("Content-Type", contentType);response.setHeader("Content-Disposition", contentDisposition);//绑定流ServletOutputStream output = response.getOutputStream();IOUtils.copy(input, output);}public static String filenameEncoding(String filename,HttpServletRequest request) throws IOException {String agent = request.getHeader("User-Agent"); // 获取浏览器if (agent.contains("Firefox")) {BASE64Encoder base64Encoder = new BASE64Encoder();filename = "=?utf-8?B?"+ base64Encoder.encode(filename.getBytes("utf-8")) + "?=";} else if (agent.contains("MSIE")) {filename = URLEncoder.encode(filename, "utf-8");} else {filename = URLEncoder.encode(filename, "utf-8");}return filename;}}


0 0
原创粉丝点击