欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JavaEE实现文件下载

程序员文章站 2024-03-31 15:30:28
 我们先来看一个最简单的文件下载的例子: 复制代码 代码如下:  package com.yyz.response;  import j...

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

复制代码 代码如下:

 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(");
         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显示如下:

JavaEE实现文件下载

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

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

JavaEE实现文件下载

  要解决这个问题,要用到 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(");
         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);
     }
 }

 附上测试结果:

JavaEE实现文件下载

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

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