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{@Overridepublic void configureViewResolvers(ViewResolverRegistry registry) {InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();viewResolver.setViewClass(JstlView.class);viewResolver.setPrefix("/WEB-INF/views/");viewResolver.setSuffix(".jsp");registry.viewResolver(viewResolver);}@Overridepublic 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 {@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class[] { HelloWorldConfiguration.class };}@Overrideprotected Class<?>[] getServletConfigClasses() {return null;}@Overrideprotected 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

點擊第二個鏈接。外部文件應被下載。

點擊第一個鏈接。內部文件[這是一個PDF]應該顯示在瀏覽器中,這是由于?Content-Disposition: inline. 通過內聯,如果內容可以通過瀏覽器顯示,它會顯示它在瀏覽器中。

現在從內聯更改內容處置備注。構建并部署。點擊第一個鏈接。這個時候您應該看到 PDF文件被下載。

就這樣,完成!

?

下載代碼:http://pan.baidu.com/s/1c1lmeL6

轉載于:https://www.cnblogs.com/jxldjsn/p/5671582.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/256812.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256812.shtml
英文地址,請注明出處:http://en.pswp.cn/news/256812.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

學習筆記(54):Python實戰編程-Scale

立即學習:https://edu.csdn.net/course/play/19711/343117?utm_sourceblogtoedu 1.滑塊組件Scale: 用于定義一定范圍的區間&#xff0c;如音量大小的調整就是滑塊組件&#xff0c;這里是以滑動滑塊來改變標簽文字的大小為例進行說明的 2.知識點&#xff1a; 1&#xff09;滑…

不可不知的:iOS開發的22個詭異技巧

結合自身的實踐開發經驗總結出了22個iOS開發的小技巧&#xff0c;以非常歡樂的語調輕松解決開發過程中所遇到的各種苦逼難題&#xff0c;光讀著便已忍俊不禁。 1. TableView不顯示沒內容的Cell怎么辦&#xff1f; 類似于圖1&#xff0c;我不想讓下面的那些空顯示。很簡單&#…

linux刪除之前的文件日志

linux下每天都在產生LOG日志文件&#xff0c;如果不定期刪除&#xff0c;遲早擠爆硬盤&#xff0c;如果手動刪除&#xff0c;幾次可以&#xff0c;不是長久之計。這些事交給Linux系統就可以解決。 試驗環境&#xff1a; 系統&#xff1a;CentOS 6.5 x64 測試路徑、測試文件名、…

線程操作范例

實例要求&#xff1a; 設計一個線程操作類&#xff0c;要求可以產生三個線程對象&#xff0c;并可以分別設置三個線程的休眠時間。如下所示&#xff1a; 問怎么設計&#xff1f; 分析 從之前學習知道&#xff0c;線程的實現有兩種方式&#xff0c;一種是繼承Thread類&#xff0…

學習筆記(55):Python實戰編程-Scrollbar

立即學習:https://edu.csdn.net/course/play/19711/343118?utm_sourceblogtoedu 1.滾動條ScrollBar&#xff1a; 當列表內容項的內容過多時&#xff0c;就需要使用到這個滾動條來進行拖動顯示更多的其他選項&#xff1b;一般滾動條是和listbox配對使用的 2.注意事項&#xff…

【轉】Unity3D研究院之使用Xamarin Studio調試Unity程序

如果你是在windows上開發&#xff0c;就無視這篇文章吧。 為什么要用Xamarin Studio 你可以看看我之前的文章 http://www.xuanyusong.com/archives/2683 unity4.x 和 unity5.x都可以用Xamarin Studio 來調試&#xff0c;親測&#xff01; 先下載插件&#xff1a;http://files.u…

配置SMB共享 、 配置NFS共享

虛擬機&#xff0c;均要檢測1. Yum是否可用2. 防火墻默認區域修改為trusted3. IP地址是否配置########################################################################################################### samba 文件共享&#xff08;共享文件夾&#xff09; Samba 軟件…

stdout標準輸出、stderr標準錯誤輸出 標準輸入、標準輸出、標準錯誤輸出分別被定義為0、1、2。

$ make > compile.log 2>&1 首先將標準錯誤輸出也重定向到標準輸出中&#xff0c;再將標準輸出重定向到 compile.log 這個文件中。這樣我們就可以將所有的輸出都存儲到文件中了。

centos7 和centos 6的一些區別

平時的我們基本都用CentOS 6 。但是偶爾遇到的就記錄下來了&#xff0c;與大家分享。防火墻[CentOS 6] iptables[CentOS 7] firewalld在7中開啟80端口 firewall-cmd --zonepublic --add-port80/tcp --permanent #出現success表明添加成功復制代碼命令含義&#xff1a…

systemverilog 起步

轉一篇Systemverilog的一個牛人總結&#xff1a; http://blog.sina.com.cn/s/blog_5e9b181a010188re.html 1、合并數組和非合并數組 1&#xff09;合并數組&#xff1a; 存儲方式是連續的&#xff0c;中間沒有閑置空間。 例如&#xff0c;32bit的寄存器&#xff0c;可以看成是4…

學習筆記(56):Python實戰編程-Menu

立即學習:https://edu.csdn.net/course/play/19711/343119?utm_sourceblogtoedu 1.菜單menu: 1&#xff09;彈出式菜單&#xff0c;類似與電腦桌面右擊彈出的菜單成為彈出菜單&#xff1b; 2&#xff09;窗體式菜單&#xff1a;類似于word上面的菜單欄 2.窗體菜單創建的步驟…

SystemCenter2012SP1實踐(19)集成WSUS更新服務器2012

今天我們的任務是配置一臺WSUS&#xff08;Windows更新服務器&#xff09;&#xff0c;以方便后期通過"基線"與其組合&#xff0c;完成虛擬機的系統補丁升級。WSUS是Windows系統運維自動化的一個重要組成部分&#xff0c;通過它&#xff0c;能夠節省我們很多的運維時…

像元尺寸計算

像元尺寸 X 總像素大小 感光芯片尺寸&#xff08;圖像區域大小&#xff09;

win7右鍵點擊文件夾進入命令窗口方法

方法一&#xff1a;按住shift鍵&#xff0c;鼠標右擊&#xff0c;會出現"在此處打開命令窗口"&#xff1b;方法二&#xff1a;修改注冊表&#xff0c;為鼠標右鍵添加打開命令行功能&#xff1b;(1)將下列內容賦值到記事本中&#xff0c;并保存為.reg文件。Windows Re…

教你學會Linux/Unix下的vi文本編輯器

vi編輯器是Unix/Linux系統管理員必須學會使用的編輯器。看了不少關于vi的資料&#xff0c;終于得到這個總結。首先&#xff0c;記住vi編輯器的兩個模式&#xff1a;1、命令模式2、編輯模式。在一個UNIX/Linux的shell命令或者一個以斜杠&#xff08;/&#xff09;、問號&#xf…

C++函數返回引用的含義

引用的意思就是說返回變量的地址而非變量本身。這樣子函double數結束之后存儲返回值的內存單元不會被銷毀&#xff0c;保留了它的地址。 例如下面這個例子: int a1,b; ba; b; 這個例子里執行完之后a為1&#xff0c;而b為2。 但這個例子&#xff1a; int a1; int *b&#xff1b;…

LintCode: 3 Sum

C 把3個數求和&#xff0c;轉變為2個數求和 1. 把數組排序 2. 注意過濾重復值 3. 從前到后遍歷&#xff0c;游標i 4. 從后邊數中找start &#xff0b; end &#xff1d; -arr[i]的2 sum 5. start &#xff0b; end < -arr[i], start 6. start end > -arr[i], end-- 7. s…

$* $@ $# $? $$ $! $0 $_

特殊參數&#xff1a; [xiluhuavm-xiluhua][~]$ set one two three  #使用set命令設置位置參數[xiluhuavm-xiluhua][~]$ echo $*        #打印所有位置參數 one two three[xiluhuavm-xiluhua][~]$ echo $        #打印所有位置參數 one two three[xiluhuavm-…

最優化課堂筆記03:整數規劃

二、整數規劃問題的求解方法&#xff1a;&#xff08;重點&#xff1a;分枝定界法&#xff09; 1.割平面法 1&#xff09;基本思想 2&#xff09;求解步驟 2&#xff09;重點&#xff1a;分枝定界法&#xff08;極大化的問題&#xff09;考試不會分很多次枝&#xff0c;用圖解…