---恢复内容开始---

下载

1. 下载就是向客户端响应字节数据!
  原来我们响应的都是html的字符数据!
  把一个文件变成字节数组,使用response.getOutputStream()来各应给浏览器!!!

2. 下载的要求
  * 两个头一个流!
    > Content-Type:你传递给客户端的文件是什么MIME类型,例如:image/pjpeg
      * 通过文件名称调用ServletContext的getMimeType()方法,得到MIME类型!
    > Content-Disposition:它的默认值为inline,表示在浏览器窗口中打开!attachment;filename=xxx
      * 在filename=后面跟随的是显示在下载框中的文件名称!
    > 流:要下载的文件数据!
      * 自己new一个输入流即可!

---------------------------

  1. public void doGet(HttpServletRequest req, HttpServletResponse resp)
  2. throws ServletException, IOException {
  3. /*
  4. * 两个头一个流
  5. * 1. Content-Type
  6. * 2. Content-Disposition
  7. * 3. 流:下载文件的数据
  8. */
  9. String filename = "F:/流光飞舞.mp3";
  10.  
  11. // 为了使下载框中显示中文文件名称不出乱码!
  12. // String framename = new String("流光%飞舞.mp3".getBytes("GBK"), "ISO-8859-1");
  13. String framename = filenameEncoding("流光%飞舞.mp3", req);
  14.  
  15. String contentType = this.getServletContext()
  16. .getMimeType(filename);//通过文件名称获取MIME类型
  17. String contentDisposition = "attachment;filename=" + framename;
  18. // 一个流
  19. FileInputStream input = new FileInputStream(filename);
  20.  
  21. //设置头
  22. resp.setHeader("Content-Type", contentType);
  23. resp.setHeader("Content-Disposition", contentDisposition);
  24.  
  25. // 获取绑定了响应端的流
  26. ServletOutputStream output = resp.getOutputStream();
  27.  
  28. IOUtils.copy(input, output);//把输入流中的数据写入到输出流中。
  29.  
  30. input.close();
  31. }
  32.  
  33. // 用来对下载的文件名称进行编码的!
  34. public static String filenameEncoding(String filename, HttpServletRequest request) throws IOException {
  35. String agent = request.getHeader("User-Agent"); //获取浏览器
  36. if (agent.contains("Firefox")) {
  37. BASE64Encoder base64Encoder = new BASE64Encoder();
  38. filename = "=?utf-8?B?"
  39. + base64Encoder.encode(filename.getBytes("utf-8"))
  40. + "?=";
  41. } else if(agent.contains("MSIE")) {
  42. filename = URLEncoder.encode(filename, "utf-8");
  43. } else {
  44. filename = URLEncoder.encode(filename, "utf-8");
  45. }
  46. return filename;
  47. }
  48. }

下载的细节

1. 显示在下载框中的中文名称时,会出现乱码。
  * FireFox:Base64编码。
  * 其他大部分浏览器:URL编码。

通用方案:filename = new String(filename.getBytes("GBK"), "ISO-8859-1");

  1. public static String filenameEncoding(String filename, HttpServletRequest request) throws IOException {
  2. String agent = request.getHeader("User-Agent"); //获取浏览器
  3. if (agent.contains("Firefox")) {
  4. BASE64Encoder base64Encoder = new BASE64Encoder();
  5. filename = "=?utf-8?B?"
  6. + base64Encoder.encode(filename.getBytes("utf-8"))
  7. + "?=";
  8. } else if(agent.contains("MSIE")) {
  9. filename = URLEncoder.encode(filename, "utf-8");
  10. } else {
  11. filename = URLEncoder.encode(filename, "utf-8");
  12. }
  13. return filename;
  14. }

---恢复内容结束---

javaWeb下载的更多相关文章

  1. javaweb下载文件模板

    import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import javax ...

  2. javaweb下载中的一个问题

    如果你发现,response头以及contentType都已经设置没错,但出现浏览器将下载的文件内容显示到新窗口 那么解决方案就是在请求的时候不要产生新的窗口

  3. JavaWeb下载文件response

    以下代码在 chrome.firefox,安卓自带手机浏览器上测试通过,但未经过完全测试,先记录下 public static void downLoadFile(HttpServletRequest ...

  4. javaweb下载文件

    //读取文件->写出文件 public static void main(String[] args) { InputStream in =null; OutputStream out = nu ...

  5. 解决javaWEB 下载文件中文名称乱码问题

    response.setContentType("application/x-msdownload;"); response.setCharacterEncoding(" ...

  6. Javaweb学习笔记——上传下载文件

    一.前言 在Javaweb中,上传下载是经常用到的功能,对于文件上传,浏览器在上传的过程中是以流的过程将文件传给服务器,一般都是使用commons-fileupload这个包实现上传功能,因为comm ...

  7. (转载)JavaWeb学习总结(五十)——文件上传和下载

    源地址:http://www.cnblogs.com/xdp-gacl/p/4200090.html 在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传 ...

  8. JavaWeb学习总结,文件上传和下载

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  9. JavaWeb学习总结(五十)——文件上传和下载

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

随机推荐

  1. 软件素材--c/c++干掉代码的通用方法

    while(1) { sleep(200); } #endif

  2. Lua 学习笔记 (1)

    最简单的 lua脚本 , do print ("line:", indx) end 也可以写成 , do print("line:", indx) end lu ...

  3. Java:session中的invalidate()的作用是什么呢?求解

    手工杀会话.会话失效有2种可能:超时和手工杀会话.手工杀方便省时间,程序员都爱用. 比如我做一个程序需要登录,中间访问的页面有会话控制,如果没有登录则跳转到登录页面,退出时清会话信息. 这是有两个选择 ...

  4. Zuul【基础配置】

    概述:zuul底层是基于servlet,是由一系列的filter链构成. 1.路由配置 a.单例serverId映射 zuul: routes: client-a: path: /client/** ...

  5. Python32之类和对象2(self参数及魔法方法)

    一.类方法中的self参数含义 在Python中类的方法都要有self参数,其实质为对类的实例化对象的绑定从而使得在类的实例化对象调用方法时能够确认出是对哪个对象进行操作. 带self的的参数是人家实 ...

  6. php生成动态验证码 加减算法验证码 简单验证码

    预览效果: <?php /** *ImageCode 生成包含验证码的GIF图片的函数 *@param $string 字符串 *@param $width 宽度 *@param $height ...

  7. 编程语言、Python介绍及其解释器安装、运行Python解释器的两种方式、变量、内存管理

    一.编程语言介绍 1.1 机器语言:直接用计算机能理解的二进制指令来编写程序,直接控制硬件. 1.2 汇编语言:在机器语言的基础上,用英文标签取代二进制指令来编写程序,本质上也是直接控制硬件. 以上2 ...

  8. Eclipse设置每行的最大字符数

    Eclipse默认宽度是 120 个字符.如下图所示(提示:格式化快捷键Ctrl + Shift + F): 设置步骤如下: 菜单栏倒数第二项,选择Window 下拉栏最后一项,选择Preferenc ...

  9. Golang_学习资料

    个人推荐: http://godeye.org/index.php?a=course&id=6 http://mikespook.com/learning-go/ http://coolshe ...

  10. Scala 面向对象编程之Trait

    将trait作为接口使用 // Scala中的Triat是一种特殊的概念 // 首先我们可以将Trait作为接口来使用,此时的Triat就与Java中的接口非常类似 // 在triat中可以定义抽象方 ...