java mvc例子下载_Spring4 MVC文件下载实例

这篇文章将向您展示如何使用Spring MVC4执行文件下载,我们将看到应用程序从文件系统内部以及外部文件下载文件。

本教程的主要亮点:

下载文件是相当简单的,涉及以下步骤。

创建一个InputStream到文件用于下载。

查找MIME类型下载文件的内容。

–可以是application/pdf, text/html,application/xml,image/png等等。

将内容类型与上述发现的MIME类型响应(HttpServletResponse)。

response.setContentType(mimeType);

针对以上找到MIME类型设置内容长度。

response.setContentLength(file.getLength());//length in bytes

为响应设置内容处理标头。

response.setHeader(“Content-Disposition”, “attachment; filename=” + fileName); //随着“附件”文件将下载。可能会显示一个“另存为”基于浏览器的设置对话框。

response.setHeader(“Content-Disposition”, “inline; filename=” + fileName);//通过“内联”浏览器将尝试显示内容到浏览器中(图片,PDF,文本,...)。对于其他内容类型,文件将直接下载。

从InputStream中复制字节响应到 OutputStream。

一旦复制完成后,关闭输入输出流。

完整实施例在下面讨论。

使用到以下技术:

Spring 4.2.0.RELEASE

Bootstrap v3.3.2

Maven 3

JDK 1.7

Tomcat 8.0.21

Eclipse JUNO Service Release 2

现在让我们开始

项目结构

312bf54bbd0c347bb2c2be6588dda525.png

在pom.xml中声明依赖关系

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

4.0.0

com.yiibai.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-war-plugin

2.4

src/main/webapp

Spring4MVCFileDownloadExample

false

Spring4MVCFileDownloadExample

创建控制器

package com.yiibai.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());

}

}

该控制器包括两个文件。一个文件是内部应用(内部资源),和其他文件位于外部的应用程序的文件系统。您的项目一定要改变外部文件的路径。仅用于演示的目的,我们已在路径一个额外的路径变量(内部/外部)。我们正在使用Spring FileCopyUtils工具类流从源复制到目的地。

配置

package com.yiibai.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.yiibai.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.yiibai.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[] { "/" };

}

}

添加视图

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)

构建,部署和运行应用程序

现在构建war(在前面的Eclipse教程)或通过Maven的命令行( mvn clean install)。部署 war 到Servlet3.0容器。或:

95fbfaffe64a58c299c7775131c96f5a.png

5671582.html

点击第二个链接。外部文件应被下载。

73c5076e62d2ba46ec4a46a8d8c6eb78.png

5671582.html

点击第一个链接。内部文件[这是一个PDF]应该显示在浏览器中,这是由于 Content-Disposition: inline. 通过内联,如果内容可以通过浏览器显示,它会显示它在浏览器中。

ecb334a2b55725d48cfa20b43ed3db40.png

5671582.html

现在从内联更改内容处置备注。构建并部署。点击第一个链接。这个时候您应该看到 PDF文件被下载。

eef67241c8014bd22c379d667bb9ded2.png

5671582.html

就这样,完成!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值