关键词:
下载功能也可以在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 |
|
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然后... 查看详情