使用HttpServletResponse实现下载功能

Posted 拾光者2013

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用HttpServletResponse实现下载功能相关的知识,希望对你有一定的参考价值。

  下载功能也可以在js中进行实现,但是这种做法会将文件地址暴露在外面,不安全。

  我们一般推荐使用后台的方法实现下载。项目中使用spring-mvc架构,这种架构下controller即为servlet的一种,使用HttpServletResponse即可像servlet一样设置response头信息,实现下载功能。

一、使用HttpServletResponse实现下载功能

  1. 获取要下载的文件的绝对路径
  2. 获取要下载的文件名
  3. 设置content-disposition响应头控制浏览器以下载的形式打开文件
  4. 获取要下载的文件输入流
  5. 创建数据缓冲区
  6. 通过response对象获取outputstream流
  7. 将FileInputStream流写入buffer缓冲区
  8. 使用outputstream将缓冲区的数据输出到客户端浏览器

二、使用HttpServletResponse实现下载功能的注意事项

  1. 编写文件下载功能时推荐使用outputstream流,避免使用PrintWriter流,因为OutputStream流是字节流,可以处理任意类型的数据,而PrintWriter流是字符流,只能处理字符数据,如果用字符流处理字节数据,会导致数据丢失。
  2. 下载中文文件时,,需要注意的地方就是中文文件名要使用URLEncoder.encode方法进行编码(URLEncoder.encode(fileName, "字符编码")),否则会出现文件名乱码。

    response.setHeader("content-disposition","attachment;filename="+URLEncoder.encode(fileName,"UTF-8"));

三、HttpServletResponse实现下载的源代码(spring-mvc controller)

 

 1 /**
 2 * 根据filePath将服务器上的图片下载到客户端本地
 3    */
 4 @RequestMapping("/downloadjpg")
 5 public void downloadjpg(@RequestParam(value="fileId")String fileId,HttpServletResponse response){
 6     JcyAppealDatum datum=jcyAppealDatumService.get(fileId);
 7     if (datum!=null) {
 8         File file= new File(datum.getFilePath());
 9         if (file.exists()) {
10             InputStream iStream=null;
11             try {
12                 iStream = new FileInputStream(file);
13                 byte[] buffer = new byte[iStream.available()];
14                 iStream.read(buffer);
15                 String fileName = datum.getFileName()+".jpg";
16                 response.setContentType("image/jpeg"); // 设置返回内容格式
17                 // 设置返回相应的头内容,中文名需转码(
18                 String exportName = "attachment;filename=" + new String((fileName).getBytes("gb2312"), "ISO8859-1");
19                 response.setHeader("Content-disposition", exportName);
20                 response.getOutputStream().write(buffer);
21             } catch (Exception e) {
22                 e.printStackTrace();
23             }finally {
24                 try {
25                     iStream.close();
26                 } catch (Exception e2) {
27                     e2.printStackTrace();
28                 }    
29             }
30     }
31             
32     }
33 }

 

四、几种常见的contentType

序号

内容类型

文件扩展名

描述

1

application/msword

doc

Microsoft Word

2

application/octet-stream bin

dms lha lzh exe class

可执行程序

3

application/pdf

pdf

Adobe Acrobat

4

application/postscript

ai eps ps

PostScript

5

appication/powerpoint

ppt

Microsoft Powerpoint

6

appication/rtf

rtf

rtf 格式

7

appication/x-compress

z

unix 压缩文件

8

application/x-gzip

gz

gzip

9

application/x-gtar

gtar

tar 文档 (gnu 格式 )

10

application/x-shockwave-flash

swf

MacroMedia Flash

11

application/x-tar

tar

tar(4.3BSD)

12

application/zip

zip

winzip

13

audio/basic

au snd

sun/next 声音文件

14

audio/mpeg

mpeg mp2

Mpeg 声音文件

15

audio/x-aiff

mid midi rmf

Midi 格式

16

audio/x-pn-realaudio

ram ra

Real Audio 声音

17

audio/x-pn-realaudio-plugin

rpm

Real Audio 插件

18

audio/x-wav

wav

Microsoft Windows 声音

19

image/cgm

cgm

计算机图形元文件

20

image/gif

gif

COMPUSERVE GIF 图像

21

image/jpeg

jpeg jpg jpe

JPEG 图像

22

image/png

png

PNG 图像

 

  

以上是关于使用HttpServletResponse实现下载功能的主要内容,如果未能解决你的问题,请参考以下文章

HttpServletResponse实现文件下载

HttpServletResponse对象实现文件下载

HttpServletResponse对象实现文件下载

HSSFWorkbook + form + HttpServletResponse 实现excel的下载

使用 HttpServletResponse 导出文件以供下载的 Grails 错误

HttpServletResponse 内容输出