写了个下载封装代码如下:
DownloadHelper.java(下载帮助类,当请求响应方法反回此对象,并用@ResponseBody声明时自动实现下载功能)
public class DownloadHelper { private boolean forOpen = false; private boolean clearFile = false; private Map<String,String> headers = new HashMap<String, String>(); private File file; private String content; private Charset charset; public DownloadHelper() { super(); setContentType(null); } public boolean isForOpen() { return forOpen; } public boolean isClearFile() { return clearFile; } /** * 设置是否清理文件 * @param clearFile */ public void setClearFile(boolean clearFile) { this.clearFile = clearFile; } /** * 如果下载对象,浏览器默认能打开的话,可以设置此属性为true在当前浏览器中打开 * @param forOpen */ public void setForOpen(boolean forOpen) { this.forOpen = forOpen; } public Map<String, String> getHeaders() { return headers; } public void setHeaders(Map<String, String> headers) { this.headers = headers; } public File getFile() { return file; } public String getContent() { return content; } public Charset getCharset() { return charset; } public void setContent(String content,Charset charset){ setCharset(charset); setContentLength(content.getBytes(charset).length); this.content = content; } /** * 设置要下载的文件 * @param file */ public void setFile(File file) { this.file = file; if (file != null) { setFileName(file.getName()); setContentLength(file.length()); try { Charset charset = FileUtil.getFileEncoding(file); if (forOpen) { setCharset(charset); } } catch (IOException e) { } } } /** * 设置要下载的文件名,界面上弹出框的提示,此方法必须在setFile方法之后调用,如果不调用使用默认setFile方法参数的文件名 * @param fileName */ public void setFileName(String fileName){ fileName = fileName==null&&getFile()!=null ? getFile().getName() : fileName; if(fileName==null)return; StringBuilder sb = new StringBuilder(); if(forOpen){ sb.append("inline;"); }else{ sb.append("attachment;"); } if(!fileName.trim().equals("")){ sb.append("filename=\""); try { sb.append(new String(fileName.getBytes("UTF-8"),"ISO8859-1")); } catch (UnsupportedEncodingException e) { sb.append("downloadfile"); } sb.append("\""); } headers.put("Content-Disposition", sb.toString()); } /** * 设置contentType响应头信息,不指定时默认为application/octet-stream,也必须在setFile方法之后调用 * @param contentType */ public void setContentType(String contentType){ StringBuilder sb = new StringBuilder(); contentType = null == contentType ? "application/octet-stream" : contentType; sb.append(contentType); sb.append(";"); headers.put("Content-Type", sb.toString()); } /** * 设置下载文件大小 * @param size */ public void setContentLength(long size){ headers.put("Content-Length", Long.toString(size)); } /** * 设置文件编码 * @param charset */ public void setCharset(Charset charset){ this.charset = charset; String contentType = ConvertUtil.convert(String.class, headers.get("Content-Type"), ""); contentType += "charset="+charset.name()+";"; headers.put("Content-Type", contentType); }
DownloadHttpMessageConverter.java
public class DownloadHttpMessageConverter extends AbstractHttpMessageConverter<DownloadHelper> { @Override protected DownloadHelper readInternal(Class<? extends DownloadHelper> arg0, HttpInputMessage arg1) throws IOException, HttpMessageNotReadableException { throw new UnsupportedOperationException(); } @Override public boolean canRead(Class<?> clazz, MediaType mediaType) { return false; } @Override public boolean canWrite(Class<?> clazz, MediaType mediaType) { return DownloadHelper.class.equals(clazz); } @Override protected boolean supports(Class<?> clazz) { throw new UnsupportedOperationException(); } @Override protected void writeInternal(DownloadHelper downFile, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { overrideHeader(outputMessage.getHeaders(), downFile.getHeaders()); File f = downFile.getFile(); if(f!=null){ FileCopyUtils.copy(new FileInputStream(f), outputMessage.getBody()); if(downFile.isClearFile()){ f.delete(); } }else{ FileCopyUtils.copy(downFile.getContent(),new OutputStreamWriter(outputMessage.getBody(),downFile.getCharset())); } } private void overrideHeader(HttpHeaders headers,Map<String,String> map){ for(Map.Entry<String, String> entry : map.entrySet()){ String key = entry.getKey(); String value = entry.getValue(); if(headers.containsKey(key)&&value!=null){ headers.remove(key); } headers.add(key, value); } } }
springmvc配置文件
<mvc:message-converters> <bean class="xg.DownloadHttpMessageConverter" /> </mvc:message-converters>
调用
@RequestMapping("/download") @ResponseBody public DownloadHelper download(){ DownloadHelper dh = new DownloadHelper(); //下载具体文件 dh.setFile(new File("c:/a.txt")); //下载文本字符串如下 //dh.setContent("aaaaaaaaaaaa", Charset.forName("UTF-8")); //指定下载文件名 dh.setFileName("下载名"); return dh; }
相关推荐
本篇将详细探讨如何利用SpringMVC结合EasyUI实现文件下载功能,并着重讲解SpringMVC中的注解技术。 首先,SpringMVC是Spring框架的一部分,它提供了模型-视图-控制器(MVC)架构模式的实现,简化了Java Web应用程序...
SpringMVC是一个强大的Java web开发框架,用于构建高效、可维护的Web应用程序。在这个实例中,我们将探讨如何...在这个实例中,提供的"springMVC文件上传.txt"文件可能包含更详细的代码实现或步骤解释,供学习者参考。
SpringMVC的文件下载方式
**二、SpringMVC文件下载** 文件下载主要是通过创建一个控制器方法,生成一个包含文件内容的HTTP响应。这里的关键是设置响应头的`Content-Disposition`属性,指示浏览器如何处理响应体。 1. **创建下载链接**:在...
本文档主要介绍了SpringMVC的ModelAndView机制,使用SpringMVC实现文件上传,下载以及全局异常处理机制
在SpringMVC框架中,文件的上传和下载是常见的功能需求,主要用于处理用户的数据交互,例如用户上传图片、文档等,或者系统提供文件下载服务。本文将深入探讨如何使用SpringMVC来实现这一功能。 首先,我们需要理解...
在SpringMVC框架中,实现文件的上传与下载是常见的需求。IntelliJ IDEA作为流行的Java开发集成环境,为开发者提供了高效便捷的开发体验。在这个项目中,我们使用IDEA来构建一个基于SpringMVC的系统,实现了文件的...
SpringMVC提供MultipartFile接口处理文件上传,而文件下载则可以通过StreamingResponseBody或者直接返回文件路径实现。这些功能的实现涉及了流处理和响应头设置,确保了文件传输的正确性和效率。 异常处理在Web应用...
有效的纠正了下载时出现的文件类型未知或没有扩展名的情况,也处理了spring下载的情况下文件名以@RequestMapping的value值为下载文件名称的情况
基于springmvc实现文件上传下载 基于AOP的日志功能基于springmvc实现文件上传下载 基于AOP的日志功能基于springmvc实现文件上传下载 基于AOP的日志功能基于springmvc实现文件上传下载 基于AOP的日志功能基于...
在JavaEE企业级开发中,SpringMVC框架是广泛用于构建Web应用程序的工具,它提供了丰富的功能,包括处理文件上传和下载。本实验报告将详细阐述如何利用SpringMVC实现文件上传与下载的功能。 首先,文件上传的核心...
本文将从基本概念到实现细节,全方位介绍SpringMVC文件下载的实现过程。 一、文件下载概述 文件下载是指从Web服务器上下载文件到客户端计算机的过程。在本文中,我们将使用SpringMVC框架来实现文件下载功能。文件...
springMvc学习
本文主要目的是记录自己基于SpringMVC实现的文件上传和下载的工具类的编写,代码经过测试可以直接运行在以后的项目中。开发的主要思路是对上传和下载文件进行抽象,把上传和下载的核心功能抽取出来分装成类。
《尚硅谷SpringMVC部分全套教学文档笔记》涵盖了SpringMVC框架的核心概念和技术,通过一系列章节深入浅出地讲解了SpringMVC的各个方面。以下是基于这些文档内容的详细知识点总结: 1. **SpringMVC概述与HelloWorld*...
在SpringMVC框架中,文件操作是常见的功能需求,包括文件的上传、下载、更新和删除。本项目提供了完整的解决方案,覆盖了这些功能点。以下将详细解释这些知识点。 一、文件上传 在SpringMVC中,文件上传主要依赖于`...
通过以上步骤,我们可以利用 Netty 的高性能特性处理网络通信,结合 SpringMVC 的 MVC 模式来处理业务逻辑,实现高效的文件下载服务。这种整合方式尤其适用于大文件下载或高并发场景,能充分利用硬件资源,提升用户...
SpringMVC提供了便捷的文件上传支持,通过`@RequestParam("file") MultipartFile file`注解接收文件,并且可以处理文件的保存和下载操作。这涉及到文件流的读写以及文件存储策略。 异常处理是任何应用程序都需要...
springMvc 文件上传,springMvc 支持单文件和多文件上传,
文件上传是项目开发中最常见的功能。为了能上传文件,必须将表单的method设置为POST,并将enctype设置为multipart/form-data。只有在这样的情况下,浏览器才会把用户选择的文件以二进制数据发送给服务器。 一旦设置...