zoukankan      html  css  js  c++  java
  • 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

    现在让我们开始

    项目结构

    在pom.xml中声明依赖关系

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.yiibai.springmvc</groupId>
      <artifactId>Spring4MVCFileDownloadExample</artifactId>
      <packaging>war</packaging>
      <version>1.0.0</version>
      <name>Spring4MVCFileDownloadExample Maven Webapp</name>
     
         <properties>
    		<springframework.version>4.2.0.RELEASE</springframework.version>
    	</properties>
    
    	<dependencies>
    		<dependency>
    			<groupId>org.springframework</groupId>
    			<artifactId>spring-webmvc</artifactId>
    			<version>${springframework.version}</version>
    		</dependency>
    
    		<dependency>
    			<groupId>javax.servlet</groupId>
    			<artifactId>javax.servlet-api</artifactId>
    			<version>3.1.0</version>
    		</dependency>
    		<dependency>
    			<groupId>javax.servlet</groupId>
    			<artifactId>jstl</artifactId>
    			<version>1.2</version>
    		</dependency>
    	</dependencies>
    
    
    	<build>
    		<pluginManagement>
    			<plugins>
    				<plugin>
    					<groupId>org.apache.maven.plugins</groupId>
    					<artifactId>maven-war-plugin</artifactId>
    					<version>2.4</version>
    					<configuration>
    						<warSourceDirectory>src/main/webapp</warSourceDirectory>
    						<warName>Spring4MVCFileDownloadExample</warName>
    						<failOnMissingWebXml>false</failOnMissingWebXml>
    					</configuration>
    				</plugin>
    			</plugins>
    		</pluginManagement>
    
    		<finalName>Spring4MVCFileDownloadExample</finalName>
    	</build>
    </project>
     

    创建控制器

    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[] { "/" };
        }
     
     }
    

    添加视图

    <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <html>
    
    <head>
    	<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    	<title>Spring 4 MVC File Download Example</title>
    	<link href="<c:url value='/static/css/bootstrap.css' />"  rel="stylesheet"></link>
    	<link href="<c:url value='/static/css/app.css' />" rel="stylesheet"></link>
    </head>
    <body>
    	<div class="form-container">
    		<h1>Welcome to FileDownloader Example</h1>
    		
    		Click on below links to see FileDownload in action.<br/><br/>
    		
    		
    		<a href="<c:url value='/download/internal' />">Download This File (located inside project)</a>  
    		<br/>
    		<a href="<c:url value='/download/external' />">Download This File (located outside project, on file system)</a>
    		
    	</div> 
    </body>
    </html>
    

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

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

    打开浏览器,浏览 http://localhost:8080/Spring4MVCFileDownloadExample

    Spring4MVCFileDownloadExample_img2

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

    Spring4MVCFileDownloadExample_img3

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

    Spring4MVCFileDownloadExample_img4

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

    就这样,完

  • 相关阅读:
    Kubernetes 学习15 kubernetes 认证及serviceaccount
    Kubernetes 学习14 kubernetes statefulset
    Kubernetes 学习13 kubernetes pv pvc configmap 和secret
    Day_13【IO流】扩展案例2_统计指定项目文件中字符出现的次数
    Day_13【IO流】扩展案例1_读取项目文件内容并去重
    Day_12【集合】扩展案例4_判断字符串每一个字符出现的次数
    Day_12【集合】扩展案例3_产生10个长度为10,不能重复,由数字0-9,小写字母和大写字母组成的字符串
    Day_12【集合】扩展案例2_键盘录入一个字符串,对其进行去重,并将去重后的字符串组成新数组
    Day_12【集合】扩展案例1_利用集合的知识对长度为10的int数组进行去重,产生新数组,不能改变数组中原来数字的大小顺序
    Day_11【集合】扩展案例5_对list集合对象中的元素进行反转,求最大值最小值,求元素i在list集合中首次出现的索引,将oldvalue替换为newvalue
  • 原文地址:https://www.cnblogs.com/borter/p/9519819.html
Copyright © 2011-2022 走看看