java文件下载

文件下载最直接的方法就是把文件直接放到服务器的目录中,用户直接访问该文件就可以直接下载。
但是实际上这种方式并不一定好用,比如我们在服务器上直接放置一个MP3文件,然后通过浏览器访问该文件的地址,如果是IE浏览器可能就会弹出下载窗口,而如果是FireFox和Chrome则有可能直接播放。再有就是有一些文件我们是不希望用户可以直接访问到的,这是我们就要通过Servlet来完成下载功能。
下载文件的关键是几点:
1.服务器以一个流的形式将文件发送给浏览器。
2.发送流的同时还需要设置几个响应头,来告诉浏览器下载的信息。
具体响应头如下:
Content-Type
下载文件的MIME类型
可以通过servletContext. getMimeType(String file)获取
也可以直接手动指定
使用response.setContentType(String type);
响应头样式:
Content-Type: audio/mpeg
Content-Disposition
下载文件的名字,主要作用是提供一个默认的用户名
通过response.setHeader("Content-Disposition", disposition)设置
响应头样式:
Content-Disposition: attachment; filename=xxx.mp3
Content-Length
下载文件的长度,用于设置文件的长处(不必须)
通过response. setContentLength(int len)设置。
设置后样式:
Content-Length: 3140995
3.接下来需要以输入流的形式读入硬盘上的文件
FileInputStream is = new FileInputStream(file);
这个流就是我们一会要发送给浏览器的内容
4.通过response获取一个输出流,并将文件(输入流)通过该流发送给浏览器
获取输出流
ServletOutputStream out = response.getOutputStream();
通过输出流向浏览器发送文件(不要忘了关闭输入流)
byte[] b = new byte[1024];
int len = 0;
while((len=is.read(b))> 0){
    out.write(b, 0, len);
}
is.close();

一下步骤都是在同一个Servlet的doGet()方法中编写的
我所下载的文件是放在WEB-INF下mp3文件夹中的文件
具体步骤
1.获取文件的流:

String realPath = getServletContext().getRealPath("/WEB-INF/mp3/中国话.mp3");
//获取文件的File对象
File file = new File(realPath);
//获取文件的输入流
FileInputStream is = new FileInputStream(file);

2.获取头信息

//获取文件的MIME信息
String contentType = getServletContext().getMimeType(realPath);
//设置下载文件的名字
String filename = "zhongguohua.mp3";
//创建Content-Disposition信息
String disposition = "attachment; filename="+ filename ;
//获取文件长度
long size = file.length();

3.设置头信息

//设置Content-Type
response.setContentType(contentType);
//设置Content-Disposition
response.setHeader("Content-Disposition", disposition);
//设置文件长度
response.setContentLength((int)size);

4.发送文件

//通过response获取输出流,用于向浏览器输出内容
ServletOutputStream out = response.getOutputStream();
//将文件输入流通过输出流输出
byte[] b = new byte[1024];
int len = 0;
while((len=is.read(b))> 0){
    out.write(b, 0, len);
}
//最后不要忘记关闭输入流,输出流由Tomcat自己处理,我们不用手动关闭
is.close();

传输文件所出现的乱码问题及解决方式
至此实际上文件下载的主要功能都已经完成。但是还有一个问题我们这里没有体现出来,因为目前我们的文件名使用的是纯英文的,没有乱码问题。这里如果我们要使用中文文件名的话,毫无疑问会出现乱码问题。
解决此问题的方法很简单,在获取文件名之后为文件名进行编码:

filename = java.net.URLEncoder.encode(filename,"utf-8");

但是注意这里火狐浏览器比较特殊,因为他默认是以BASE64解码的,所以这块如果需要考虑火狐的问题的话还需要特殊处理一下。
1.先要获取客户端信息(通过获取请求头中的User-Agent信息)

//获取客户端信息
String ua = request.getHeader("User-Agent");

2.然后判断浏览器版本,做不同的处理(通过判断头信息中是否包含Firefox字符串来判断浏览器版本)

//判断客户端是否为火狐
if(ua.contains("Firefox")){
    //若为火狐使用BASE64编码
    filename = "=?utf-8?B?"+new BASE64Encoder()
.encode(filename.getBytes("utf-8"))+"?=";
}else{
    //否则使用UTF-8
    filename = URLEncoder.encode(filename,"utf-8");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值