【本系列其他教程正在陆续翻译中,点击分类:spring 4 mvc 进行查看。源码下载地址在文章末尾。】
【翻译 by 明明如月 QQ 605283073】
原文地址: http://websystique.com/springmvc/spring-mvc-4-file-download-example/
上一篇:Spring MVC 4 使用常规的fileupload上传文件(带源码)
下一篇:Spring MVC 4使用Servlet 3 MultiPartConfigElement实现文件上传(带源码)
本文将为你展示通过Spring MVC 4实现文件下载。
下载一个文件比较简单,主要包括下面几个步骤.
找到下载文件类型的MIME type
.
– 可能是 application/pdf, text/html,application/xml,image/png, ..或者其他类型.在response(HttpServletResponse)中设置 Content-Type 为上面的值
.
response.setContentType(mimeType);设置Content length
文件长度.
response.setContentLength(file.getLength());//字节长度下面是完整的例子
所用的技术或者软件:
让我们开始吧
4.0.0
com.websystique.springmvc
Spring4MVCFileDownloadExample
war
1.0.0
Spring4MVCFileDownloadExample Maven Webapp
4.2.0.RELEASE
org.springframework
spring-webmvc
${springframework.version}
javax.servlet
javax.servlet-api
3.1.0
javax.servlet
jstl
1.2
org.apache.maven.plugins
maven-compiler-plugin
3.2
1.7
1.7
org.apache.maven.plugins
maven-war-plugin
2.4
src/main/webapp
Spring4MVCFileDownloadExample
false
Spring4MVCFileDownloadExample
package com.websystique.springmvc.controller;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLConnection;
import java.nio.charset.Charset;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class FileDownloadController {
private static final String INTERNAL_FILE="irregular-verbs-list.pdf";
private static final String EXTERNAL_FILE_PATH="C:/mytemp/SpringMVCHibernateManyToManyCRUDExample.zip";
@RequestMapping(value={"/","/welcome"}, method = RequestMethod.GET)
public String getHomePage(ModelMap model) {
return "welcome";
}
/*
* Download a file from
* - inside project, located in resources folder.
* - outside project, located in File system somewhere.
*/
@RequestMapping(value="/download/{type}", method = RequestMethod.GET)
public void downloadFile(HttpServletResponse response, @PathVariable("type") String type) throws IOException {
File file = null;
if(type.equalsIgnoreCase("internal")){
ClassLoader classloader = Thread.currentThread().getContextClassLoader();
file = new File(classloader.getResource(INTERNAL_FILE).getFile());
}else{
file = new File(EXTERNAL_FILE_PATH);
}
if(!file.exists()){
String errorMessage = "Sorry. The file you are looking for does not exist";
System.out.println(errorMessage);
OutputStream outputStream = response.getOutputStream();
outputStream.write(errorMessage.getBytes(Charset.forName("UTF-8")));
outputStream.close();
return;
}
String mimeType= URLConnection.guessContentTypeFromName(file.getName());
if(mimeType==null){
System.out.println("mimetype is not detectable, will take default");
mimeType = "application/octet-stream";
}
System.out.println("mimetype : "+mimeType);
response.setContentType(mimeType);
/* "Content-Disposition : inline" will show viewable types [like images/text/pdf/anything viewable by browser] right on browser
while others(zip e.g) will be directly downloaded [may provide save as popup, based on your browser setting.]*/
response.setHeader("Content-Disposition", String.format("inline; filename=\"" + file.getName() +"\""));
/* "Content-Disposition : attachment" will be directly download, may provide save as popup, based on your browser setting*/
//response.setHeader("Content-Disposition", String.format("attachment; filename=\"%s\"", file.getName()));
response.setContentLength((int)file.length());
InputStream inputStream = new BufferedInputStream(new FileInputStream(file));
//Copy bytes from source to destination(outputstream in this example), closes both streams.
FileCopyUtils.copy(inputStream, response.getOutputStream());
}
}
package com.websystique.springmvc.configuration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.websystique.springmvc")
public class HelloWorldConfiguration extends WebMvcConfigurerAdapter{
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setViewClass(JstlView.class);
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".jsp");
registry.viewResolver(viewResolver);
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("/static/");
}
}
package com.websystique.springmvc.configuration;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class HelloWorldInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class[] getRootConfigClasses() {
return new Class[] { HelloWorldConfiguration.class };
}
@Override
protected Class[] getServletConfigClasses() {
return null;
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Spring 4 MVC File Download Example
Welcome to FileDownloader Example
Click on below links to see FileDownload in action.
Download This File (located inside project)
Download This File (located outside project, on file system)
在tomcat里面发布运行
浏览器输入 http://localhost:8080/Spring4MVCFileDownloadExample
点击第二个超链接 将下载外部(项目外)文件
点击第一个超链接. 内部(项目内部)文件 [一个 PDF] 将在浏览器中显示, 如果能在浏览器能够显示就会被显示在浏览器里面。
把Content-Disposition 从inline设置为 attachment.构建并重新发布 点第一个链接,PDF将被下载下来。
项目下载:http://websystique.com/?smd_process_download=1&download_id=1769