您的位置:首页 > 理论基础 > 计算机网络

使用HttpServletResponse实现下载功能

2017-03-20 11:39 387 查看
  下载功能也可以在js中进行实现,但是这种做法会将文件地址暴露在外面,不安全。

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

一、使用HttpServletResponse实现下载功能

获取要下载的文件的绝对路径

获取要下载的文件名

设置content-disposition响应头控制浏览器以下载的形式打开文件

获取要下载的文件输入流

创建数据缓冲区

通过response对象获取outputstream流

将FileInputStream流写入buffer缓冲区

使用outputstream将缓冲区的数据输出到客户端浏览器

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

编写文件下载功能时推荐使用outputstream流,避免使用PrintWriter流,因为OutputStream流是字节流,可以处理任意类型的数据,而PrintWriter流是字符流,只能处理字符数据,如果用字符流处理字节数据,会导致数据丢失。

下载中文文件时,,需要注意的地方就是中文文件名要使用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 图像

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: