使用httpservletresponse实现下载功能

拾光者2013 拾光者2013     2022-08-25     593

关键词:

  下载功能也可以在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实现文件下载

importjava.io.BufferedInputStream;importjava.io.BufferedOutputStream;importjava.io.File;importjava.io.FileInputStream;importjava.io.IOException;importjava.io.InputStream;importjava.io.OutputStream;imp 查看详情

httpservletresponse对象实现文件下载

...要向客户机输出数据,只需要找response对象就行了。一、HttpServletResponse对象介绍HttpServletRespon 查看详情

httpservletresponse对象实现文件下载

...要向客户机输出数据,只需要找response对象就行了。一、HttpServletResponse对象介绍HttpServletRespon 查看详情

hssfworkbook+form+httpservletresponse实现excel的下载

今天做了excel的导出下载,折腾了一天才发现ajax的dataType里面没有流类型,这就意味着不能用ajax来接受后台传来的输出流。但是可以用动态创建的form来代替。下面是项目实践的部分源码:1、后台Controller层(HSSFWorkbook创建excel的... 查看详情

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

】使用HttpServletResponse导出文件以供下载的Grails错误【英文标题】:GrailserrorusingHttpServletResponsetoexportfilefordownload【发布时间】:2012-11-0120:01:04【问题描述】:我在我的Grails应用程序中使用opencsv将属性从我的Person域类导出到CSV。但... 查看详情

servlet进阶4(httpservletresponse类)

HttpServletResponse类和HttpServletRequest类一样。每次请求进来,Tomcat服务器都会创建一个Response对象传递给Servlet程序去使用。HttpServletRequest表示请求过来的信息,HttpServletResponse表示所有响应的信息,我们如果需要设置返回给客户端的... 查看详情

springmvc的两种下载方式

1:通过httpServletResponse对象实现下载,觉得LOW的自行跳过 2:有人觉得既然使用的是MVC就要使用spring的方式  查看详情

httpservletresponse类(代码片段)

a)HttpServletResponse类的作用HttpServletResponse类和HttpServletRequest类一样。每次请求进来,Tomcat服务器都会创建一个Response对象传递给Servlet程序去使用。HttpServletRequest表示请求过来的信息,HttpServletResponse表示所有响应的信息࿰... 查看详情

如何将 HTTPServletResponse 转换为 HttpEntity?

】如何将HTTPServletResponse转换为HttpEntity?【英文标题】:howtoconvertHTTPServletResponseintoHttpEntity?【发布时间】:2016-05-1913:50:38【问题描述】:在我的项目中,我有多个API(使用SpringRESTAPI实现)。现在我有这个要求,我必须在将响应... 查看详情

httpservletresponse的使用(代码片段)

 场景:避免一些简单的响应数据,需要手动封装放回对象 response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,"haha系统崩了"); publicclassOrderControllerprivatestaticfinalLoggerLOGGER=getLogger(OrderControll 查看详情

httpservletresponse对象

HttpServletResponse对象HttpServletResponse对象服务器的响应。这个对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法。response常见应用向客户端输出中文数据。分别以OutputStream和PrintWriter输出。文件下载。生成随机图... 查看详情

requestdispatcher.forward转发与httpservletresponse.sendredirect重定向

下面是HttpServletResponse.sendRedirect 方法实现的请求重定向与RequestDispatcher.forward 方法实现的请求转发的总结比较:(1)RequestDispatcher.forward方法只能将请求转发给同一个WEB应用中的组件;而HttpServletResponse.sendRedirect方法不仅... 查看详情

strtus2框架使用httpservletresponse响应数据

-----------------------------------------------------------------------------------------jsp--------------------------------------------------------------------------------<scripttype="text/javascr 查看详情

如何使用 ktor 客户端设置 HttpServletResponse 的主体

】如何使用ktor客户端设置HttpServletResponse的主体【英文标题】:HowtosetbodyofHttpServletResponseusingktorclient【发布时间】:2019-11-1016:59:29【问题描述】:我有弹簧启动控制器@PostMapping(path=["/download"])fungetFile(@RequestBodymyObjectRq:myObjectRq,httpS... 查看详情

使用 Spring MVC HandlerInterceptorAdapter 从 HttpServletResponse 记录响应正文 (HTML)

】使用SpringMVCHandlerInterceptorAdapter从HttpServletResponse记录响应正文(HTML)【英文标题】:Loggingresponsebody(HTML)fromHttpServletResponseusingSpringMVCHandlerInterceptorAdapter【发布时间】:2011-01-1015:31:48【问题描述】:我正在尝试记录(为了简单起见... 查看详情

HttpServletResponse sendRedirect 永久

】HttpServletResponsesendRedirect永久【英文标题】:HttpServletResponsesendRedirectpermanent【发布时间】:2012-02-2011:49:28【问题描述】:这将使用临时302HTTP状态代码重定向请求:HttpServletResponseresponse;response.sendRedirect("http://somewhere");但是是否... 查看详情

将 InputStream 写入 HttpServletResponse

】将InputStream写入HttpServletResponse【英文标题】:WriteanInputStreamtoanHttpServletResponse【发布时间】:2012-04-2521:51:34【问题描述】:我有一个要写入HttpServletResponse的InputStream。有这种方法,由于使用了byte[]InputStreamis=getInputStream();intconten... 查看详情

正确使用 HttpServletResponse response.reset() 以及如何摆脱它

】正确使用HttpServletResponseresponse.reset()以及如何摆脱它【英文标题】:CorrectuseofHttpServletResponseresponse.reset()andhowcanIgetridofit【发布时间】:2020-03-1705:18:32【问题描述】:我有一个返回JSON响应的servlet。如果我执行response.getWriter然后... 查看详情