JavaEE实现文件下载

 更新时间:2014年10月26日 11:01:47   投稿:hebedich  
这篇文章主要介绍了JavaEE实现文件下载的方法,非常的实用,需要的朋友可以参考下

 我们先来看一个最简单的文件下载的例子:

复制代码 代码如下:

 package com.yyz.response;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.OutputStream;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 //文件下载
 public class ResponseDemo extends HttpServlet {
     public void doGet(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {
         String realpath = this.getServletContext().getRealPath("/download/1.gif");
         String filename = realpath.substring(realpath.lastIndexOf("\\")+1);
         response.setHeader("content-disposition", "attachment;filename="+filename);
         //服务器通过这个头,告诉浏览器以下载方式打开数据
         FileInputStream in = new FileInputStream(realpath);
         int len = 0;
         byte buffer[]=new byte[1024];
         OutputStream out = response.getOutputStream();
         while((len = in.read(buffer))>0){
             out.write(buffer, 0, len);
             }
         in.close();
         //out不用close,response在销毁的时候服务器会自动关闭与response相关的流。
 }
     public void doPost(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {
            doGet(request,response);
     }
 }

 该段代码的功能是从服务器端下载图片1.png。目录结构用MyEclipse的package explorer显示如下:

  让我们增加一点难度,我们要下载的文件是一个中文名字的文件。由于在http协议中头文件中的东西只能是ASCII字符,因而通过上述方式(直接将  String realpath = this.getServletContext().getRealPath("/download/1.gif");改为  String realpath = this.getServletContext().getRealPath("/download/图片.gif");)直接拿文件,

会出现乱码问题。附上测试结果:

  要解决这个问题,要用到 URLEncoder类的encode方法:

复制代码 代码如下:

 package com.yyz.response;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.net.URLEncoder;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 //中文文件下载时,中文文件名要经过URL编码。
 public class ResponseDemo extends HttpServlet {
     public void doGet(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {
         String realpath = this.getServletContext().getRealPath("/download/图片.gif");
         String filename = realpath.substring(realpath.lastIndexOf("\\")+1);
         response.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(filename,"UTF-8"));
        //本函数将字符串以 URL 编码
         FileInputStream in = new FileInputStream(realpath);
         int len = 0;
         byte buffer[]=new byte[1024];
         OutputStream out = response.getOutputStream();
         while((len = in.read(buffer))>0){
             out.write(buffer, 0, len);
             }
         in.close();
 }
     public void doPost(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {
            doGet(request,response);
     }
 }

 附上测试结果:

    另外这里有一个小细节需要大家注意:

   不能用FileReader代替FileInputStream。用FileReader会丢失数据,原因是这样的:FileReader是字符流,而图片,媒体文件等的数据都是以01的方式存储,用FileReader读的时候需要查阅一个编码表,如果未指定一种编码,则使用相应平台的默认编码。如在中国的电脑就会去查GB2312。当读到GB2312码表中不存在的编码时,会将该数据编码成'?',结束后数据就变成中文和'?'的混合。发到客户端后显示时再次查阅码表,将所有的'?'替换成'?'的编码,就会丢失数据。向这种细节只需要记住一点:字节流可以处理任意类型的数据,字符流只能处理字符数据。

相关文章

  • Java之int数组声明与初始化方式

    Java之int数组声明与初始化方式

    这篇文章主要介绍了Java之int数组声明与初始化方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Spring Boot Reactor 整合 Resilience4j详析

    Spring Boot Reactor 整合 Resilience4j详析

    这篇文章主要介绍了Spring Boot Reactor整合Resilience4j详析,文章通过引入pom包展开详细介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下
    2022-09-09
  • IDEA如何将右下角提示框禁止弹出问题

    IDEA如何将右下角提示框禁止弹出问题

    这篇文章主要介绍了IDEA如何将右下角提示框禁止弹出问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Spring cloud如何实现FeignClient指定Zone调用

    Spring cloud如何实现FeignClient指定Zone调用

    这篇文章主要介绍了Spring cloud如何实现FeignClient指定Zone调用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Spring的@Bean和@Autowired组合使用详解

    Spring的@Bean和@Autowired组合使用详解

    这篇文章主要介绍了Spring的@Bean和@Autowired组合使用详解,Spring的@Bean注解用于告诉方法,产生一个Bean对象,然后这个Bean对象交给Spring管理,产生这个Bean对象的方法Spring只会调用一次随后会将这个Bean对象放在自己的IOC容器,需要的朋友可以参考下
    2024-01-01
  • Java通过自定义类加载器实现类隔离

    Java通过自定义类加载器实现类隔离

    类隔离是一种通过类加载器实现加载所需类的实现方式,使得不同版本类间隔离,避免了使用冲突问题。本文将通过自定义的类加载器实现类隔离,感兴趣的可以了解一下
    2022-08-08
  • Spring手动获取bean的四种方式

    Spring手动获取bean的四种方式

    本文主要介绍了Spring手动获取bean的四种方式,包括BeanFactoryPostProcessor接口,ApplicationContextAware接口,注解 @PostConstruct 初始化时获取,启动类ApplicationContext获取这四种方法,感兴趣的可以了解一下
    2024-01-01
  • spring boot异步(Async)任务调度实现方法

    spring boot异步(Async)任务调度实现方法

    在没有使用spring boot之前,我们的做法是在配置文件中定义一个任务池,然后将@Async注解的任务丢到任务池中去执行,那么在spring boot中,怎么来实现异步任务的调用了,下面通过本文给大家讲解,需要的朋友参考下
    2018-02-02
  • 使用ANT与YUI压缩js的实现方法

    使用ANT与YUI压缩js的实现方法

    本篇文章是对使用ANT与YUI压缩js的实现方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • Java读取PDF中的表格的方法示例

    Java读取PDF中的表格的方法示例

    本文主要介绍了Java读取PDF中的表格的方法示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10

最新评论