`
jacktea
  • 浏览: 6998 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

SpringMVC 文件下载

    博客分类:
  • J2EE
 
阅读更多

写了个下载封装代码如下:

 

    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;
}

 

 

 

分享到:
评论
2 楼 warlock123 2014-08-06  
Charset charset = FileUtil.getFileEncoding(file);
FileUtil类无此方法;
String contentType = ConvertUtil.convert(String.class, headers.get("Content-Type"), "");
ConvertUtil 自定义的类? 还是哪个包下的?
1 楼 lsliliang 2012-07-20  
sunyard
不是数码科技吧

相关推荐

    springmvc文件下载

    本篇将详细探讨如何利用SpringMVC结合EasyUI实现文件下载功能,并着重讲解SpringMVC中的注解技术。 首先,SpringMVC是Spring框架的一部分,它提供了模型-视图-控制器(MVC)架构模式的实现,简化了Java Web应用程序...

    springMVC文件下载代码

    SpringMVC是一个强大的Java web开发框架,用于构建高效、可维护的Web应用程序。在这个实例中,我们将探讨如何...在这个实例中,提供的"springMVC文件上传.txt"文件可能包含更详细的代码实现或步骤解释,供学习者参考。

    SpringMVC文件下载-2021-04-12.txt

    SpringMVC的文件下载方式

    SpringMVC 实现文件上传下载、国际化等

    **二、SpringMVC文件下载** 文件下载主要是通过创建一个控制器方法,生成一个包含文件内容的HTTP响应。这里的关键是设置响应头的`Content-Disposition`属性,指示浏览器如何处理响应体。 1. **创建下载链接**:在...

    SpringMVC上传下载异常处理

    本文档主要介绍了SpringMVC的ModelAndView机制,使用SpringMVC实现文件上传,下载以及全局异常处理机制

    SpringMVC框架实现文件的上传和下载

    在SpringMVC框架中,文件的上传和下载是常见的功能需求,主要用于处理用户的数据交互,例如用户上传图片、文档等,或者系统提供文件下载服务。本文将深入探讨如何使用SpringMVC来实现这一功能。 首先,我们需要理解...

    IDEA SpringMVC 实现文件的上传下载

    在SpringMVC框架中,实现文件的上传与下载是常见的需求。IntelliJ IDEA作为流行的Java开发集成环境,为开发者提供了高效便捷的开发体验。在这个项目中,我们使用IDEA来构建一个基于SpringMVC的系统,实现了文件的...

    SpringMVC demo 完整源码实例下载.zip

    SpringMVC提供MultipartFile接口处理文件上传,而文件下载则可以通过StreamingResponseBody或者直接返回文件路径实现。这些功能的实现涉及了流处理和响应头设置,确保了文件传输的正确性和效率。 异常处理在Web应用...

    springmvc下Excel下载

    有效的纠正了下载时出现的文件类型未知或没有扩展名的情况,也处理了spring下载的情况下文件名以@RequestMapping的value值为下载文件名称的情况

    基于springmvc实现文件上传下载 基于AOP的日志功能

    基于springmvc实现文件上传下载 基于AOP的日志功能基于springmvc实现文件上传下载 基于AOP的日志功能基于springmvc实现文件上传下载 基于AOP的日志功能基于springmvc实现文件上传下载 基于AOP的日志功能基于...

    JavaEE企业级开发-----SpringMVC实现 文件的上传下载实验报告.docx

    在JavaEE企业级开发中,SpringMVC框架是广泛用于构建Web应用程序的工具,它提供了丰富的功能,包括处理文件上传和下载。本实验报告将详细阐述如何利用SpringMVC实现文件上传与下载的功能。 首先,文件上传的核心...

    SpringMVC实现文件下载功能

    本文将从基本概念到实现细节,全方位介绍SpringMVC文件下载的实现过程。 一、文件下载概述 文件下载是指从Web服务器上下载文件到客户端计算机的过程。在本文中,我们将使用SpringMVC框架来实现文件下载功能。文件...

    springMvc文档

    springMvc学习

    SpringMVC文件上传和下载的工具类(完整项目)

    本文主要目的是记录自己基于SpringMVC实现的文件上传和下载的工具类的编写,代码经过测试可以直接运行在以后的项目中。开发的主要思路是对上传和下载文件进行抽象,把上传和下载的核心功能抽取出来分装成类。

    尚硅谷SpringMVC部分全套教学文档笔记

    《尚硅谷SpringMVC部分全套教学文档笔记》涵盖了SpringMVC框架的核心概念和技术,通过一系列章节深入浅出地讲解了SpringMVC的各个方面。以下是基于这些文档内容的详细知识点总结: 1. **SpringMVC概述与HelloWorld*...

    SpringMVC文件增删改查(上传、更新、下载、删除)

    在SpringMVC框架中,文件操作是常见的功能需求,包括文件的上传、下载、更新和删除。本项目提供了完整的解决方案,覆盖了这些功能点。以下将详细解释这些知识点。 一、文件上传 在SpringMVC中,文件上传主要依赖于`...

    netty整合SpringMVC实现下载

    通过以上步骤,我们可以利用 Netty 的高性能特性处理网络通信,结合 SpringMVC 的 MVC 模式来处理业务逻辑,实现高效的文件下载服务。这种整合方式尤其适用于大文件下载或高并发场景,能充分利用硬件资源,提升用户...

    SpringMVC demo 完整源码实例下载

    SpringMVC提供了便捷的文件上传支持,通过`@RequestParam("file") MultipartFile file`注解接收文件,并且可以处理文件的保存和下载操作。这涉及到文件流的读写以及文件存储策略。 异常处理是任何应用程序都需要...

    springMvc单文件多文件上传

    springMvc 文件上传,springMvc 支持单文件和多文件上传,

    springMVC上传下载样例

    文件上传是项目开发中最常见的功能。为了能上传文件,必须将表单的method设置为POST,并将enctype设置为multipart/form-data。只有在这样的情况下,浏览器才会把用户选择的文件以二进制数据发送给服务器。 一旦设置...

Global site tag (gtag.js) - Google Analytics