下载
下载 1. 下载就是向客户端响应字节数据! 原来我们响应的都是html的字符数据! 把一个文件变成字节数组,使用response.getOutputStream()来各应给浏览器!!! 2. 下载的要求 * 两个头一个流! > Content-Type:你传递给客户端的文件是什么MIME类型,例如:image/pjpeg * 通过文件名称调用ServletContext的getMimeType()方法,得到MIME类型! > Content-Disposition:它的默认值为inline,表示在浏览器窗口中打开!attachment;filename=xxx * 在filename=后面跟随的是显示在下载框中的文件名称! > 流:要下载的文件数据! * 自己new一个输入流即可! --------------------------- 下载的细节 1. 显示在下载框中的中文名称时,会出现乱码。 * FireFox:Base64编码。 * 其他大部分浏览器:URL编码。 通用方案:filename = new String(filename.getBytes("GBK"), "ISO-8859-1"); 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; } --------------------------- --------------------------- 1) package cn.itcast.web.servlet; import java.io.FileInputStream; import java.io.IOException; 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 Download1Servlet extends HttpServlet { @Override public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { /* * 两个头一个流 * 1. Content-Type * 2. Content-Disposition * 3. 流:下载文件的数据 */ String filename = "F:/流光飞舞.mp3"; // 为了使下载框中显示中文文件名称不出乱码! // String framename = new String("流光%飞舞.mp3".getBytes("GBK"), "ISO-8859-1"); String framename = filenameEncoding("流光%飞舞.mp3", req); String contentType = this.getServletContext() .getMimeType(filename);//通过文件名称获取MIME类型 String contentDisposition = "attachment;filename=" + framename; // 一个流 FileInputStream input = new FileInputStream(filename); //设置头 resp.setHeader("Content-Type", contentType); resp.setHeader("Content-Disposition", contentDisposition); // 获取绑定了响应端的流 ServletOutputStream output = resp.getOutputStream(); IOUtils.copy(input, output);//把输入流中的数据写入到输出流中。 input.close(); } // 用来对下载的文件名称进行编码的! 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; } } 4)FireFox:Base64编码。 package cn.itcast.base64; import java.io.IOException; import java.io.UnsupportedEncodingException; import org.junit.Test; import sun.misc.BASE64Encoder; import sun.misc.BASE64Decoder; public class Demo1 { @Test public void fun1() throws IOException { // BASE64编码 String s = "Username"; BASE64Encoder encoder = new BASE64Encoder(); s = encoder.encode(s.getBytes("UTF-8")); System.out.println(s); // BASE64解码 BASE64Decoder decoder = new BASE64Decoder(); byte[] bytes = decoder.decodeBuffer("dXNlcm5hbWU6"); System.out.println(new String(bytes, "UTF-8")); } }