struts2實現文件查看、下載

CreateTime--2017年9月7日10:25:33

Author:Marydon

struts2實現文件查看、下載

1.界面展示

<a style="color: #199ED8;" target="_blank" href="<c:url value="/telemedicine/reseCons/viewFile.do?fileName=201516529IO.jpg"/>">查看</a>
<a style="color: #199ED8;" target="_blank" href="<c:url value="/telemedicine/reseCons/downloadFile.do?fileName=201516529IO.jpg"/>">下載</a>

2.struts2配置

<!-- 文件預覽 -->
<action name="viewFile" class="telemedicine.web.actions.reseCons.FileOperationAction"method="viewFile"><result name="success" type="stream"><!-- 設置返回的文件類型 --><param name="contentType">${contentType}</param> <!-- 設置獲取流的方法 --><param name="inputName">inputStream</param> <!-- bufferSize 設置緩沖區字節大小默認是1024 --></result>
</action>
<!-- 文件下載 -->
<action name="downloadFile" class="telemedicine.web.actions.reseCons.FileOperationAction"method="downloadFile"><result name="success" type="stream"><!-- 設置返回的文件類型 --><param name="contentType">${contentType}</param> <!-- 設置獲取文件流的方法 --><param name="inputName">inputStream</param> <!--添加參數,即就是下載的名稱-->  <param name="contentDisposition">${contentDisposition}</param><!-- bufferSize 設置緩沖區字節大小默認是1024 --></result>
</action>

說明:struts2使用${}方式動態從action類中取值  

3.action(控制器)

  3.1 供struts2取值

// 文件輸入流
private ByteArrayInputStream inputStream;
// 返回內容類型
private String contentType;
// 文件下載時,指定的名稱
private String contentDisposition;public ByteArrayInputStream getInputStream() {return inputStream;
}public String getContentType() {return contentType;
}public String getContentDisposition() {return contentDisposition;
}

  3.2 詳細代碼

需要導入:

import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Map;
import org.apache.struts2.ServletActionContext;

?

/*** 文件預覽    * @return*/
public String viewFile() {try {// 1.獲取客戶端提交參數String fileName = WebUtils.getParameter("fileName");// 2.獲取文件路徑String filePath = "WEB-INF/uploadFiles/" + fileName;// 獲取真實路徑filePath = WebUtils.getRealPath(filePath);// 字節輸出流ByteArrayOutputStream bos = new ByteArrayOutputStream();// 3.將文件轉換成文件流// 如果文件不存在,會拋出異常FileInputStream fis = new FileInputStream(filePath);// 4.將文件流讀取到緩沖區(內存中),目的:提高讀取效率InputStream input = new BufferedInputStream(fis);// 5.指定內存空間大小byte[] bt = new byte[1024];int len = 0;// 6.從內存中每次讀取1024個字節,放到字節數組bt中,然后將bt中的字節寫入到輸出流中while ((len = input.read(bt)) > 0) {bos.write(bt, 0, len);}// 7.私有屬性賦值// 7.1 字節輸入流this.inputStream = new ByteArrayInputStream(bos.toByteArray());// 7.2獲取該文件所對應的文件類型this.contentType = WebUtils.getServletContext().getMimeType(fileName);bos.close();input.close();} catch (Exception e) {this.addMessage(-1, e.getMessage());this.msg = "" + getExceptionMessage(e);this.code = -1;log.error(e.getMessage());e.printStackTrace();}return SUCCESS;
}/*** 文件下載* @return*/
public String downloadFile() {try {// 1.獲取客戶端提交參數String fileName = WebUtils.getParameter("fileName");// 2.獲取文件路徑String filePath = "WEB-INF/uploadFiles/" + fileName;// 獲取真實路徑filePath = WebUtils.getRealPath(filePath);// 字節輸出流ByteArrayOutputStream bos = new ByteArrayOutputStream();// 3.將文件轉換成文件流// 如果文件不存在,會拋出異常FileInputStream fis = new FileInputStream(filePath);// 4.將文件流讀取到緩沖區(內存中),目的:提高讀取效率InputStream input = new BufferedInputStream(fis);// 5.指定內存空間大小byte[] bt = new byte[1024];int len = 0;// 6.從內存中每次讀取1024個字節,放到字節數組bt中,然后將bt中的字節寫入到輸出流中while ((len = input.read(bt)) > 0) {bos.write(bt, 0, len);}// 7.私有屬性賦值// 7.1 字節輸入流this.inputStream = new ByteArrayInputStream(bos.toByteArray());// 7.2獲取該文件所對應的文件類型this.contentType = WebUtils.getServletContext().getMimeType(fileName);// 7.3指定下載該文件時的文件名稱this.contentDisposition = "attachment;fileName=" + fileName;bos.close();input.close();} catch (Exception e) {this.addMessage(-1, e.getMessage());this.msg = "" + getExceptionMessage(e);this.code = -1;log.error(e.getMessage());e.printStackTrace();}return SUCCESS;
}

  說明:

    其中,通過WebUtils.java類調用的方法,請依次移步至文章:struts2獲取前臺提交的參數,struts2獲取文件真實路徑和struts2獲取ServletContext對象

?

轉載于:https://www.cnblogs.com/Marydon20170307/p/7488681.html

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

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

相關文章

css文本設置

常用的應用文本的css樣式&#xff1a; color 設置文字的顏色&#xff0c;如&#xff1a; color:red; font-size 設置文字的大小&#xff0c;如&#xff1a;font-size:12px; font-family 設置文字的字體&#xff0c;如&#xff1a;font-family:微軟雅黑; font-style 設置字體…

關鍵字static

原文出處&#xff1a;http://cmsblogs.com/ 『chenssy』 一、 static代表著什么 在Java中并不存在全局變量的概念&#xff0c;但是我們可以通過static來實現一個“偽全局”的概念&#xff0c;在Java中static表示“全局”或者“靜態”的意思&#xff0c;用來修飾成員變量和成員方…

[IoC容器Unity]第三回:依賴注入

上節介紹了&#xff0c;Unity的Lifetime Managers生命周期&#xff0c;Unity具體實現依賴注入包含構造函數注入、屬性注入、方法注入&#xff0c;所謂注入相當賦值&#xff0c;下面一個一個來介紹。 2.構造函數注入 Unity利用Resolve方法解析一個對象&#xff0c;都是調用注冊類…

Apache CarbonData 1.5.0編譯及安裝

2019獨角獸企業重金招聘Python工程師標準>>> 一、編譯環境描述 OpenStack創建五個虛擬機&#xff0c;其中1個主節點&#xff08;hostname為bigdatamaster&#xff09;&#xff0c;4個從節點&#xff08;hostname分別為&#xff0c;bigdataslave1、bigdataslave2、bi…

JS控制網頁全屏

在谷歌&#xff0c;IE等瀏覽器中&#xff0c;點擊F11按鍵會進入網頁全屏模式&#xff0c;如同看電影的劇場模式&#xff0c;這個在代碼中可以通過JS來實現&#xff0c;簡單說下在實現這個需求后的個人總結&#xff1a; 底層網頁是已經加載完畢的&#xff0c;這時我們需要的全屏…

HDU 3966-Aragorn's Story 樹鏈剖分+樹狀數組

題目鏈接 題意&#xff1a;有一棵樹&#xff0c;每個節點有權值 有三種操作&#xff1a; I c1 c2 k 從節點c1到節點c2的路徑上每個節點權值增加kD c1 c2 k 從節點c1到節點c2的路徑上每個節點權值減少kQ i 查詢節點i的權值是多少思路&#xff1a; 樹鏈剖分處理出來的鏈放在數組中…

Filter介紹

Filter 可認為是 Servlet的一種 “ 加強版 ”&#xff0c;它主要用于對用戶請求進行預處理&#xff0c; 也可以對HttpServletResponse 進行后處理&#xff0c;是個典型的處理鏈。Filter 也可對用戶請求生成響應&#xff0c;這一 點與Servlet 相同&#xff0c; 但實際上很少會使…

LeetCode算法題-Jewels and Stones(Java實現)

這是悅樂書的第313次更新&#xff0c;第334篇原創 01 看題和準備 今天介紹的是LeetCode算法題中Easy級別的第182題&#xff08;順位題號是771&#xff09;。字符串J代表珠寶&#xff0c;S代表你擁有的石頭。S中的每個字符都是你擁有的一種石頭。計算S中有多少石頭也是珠寶。J中…

python --- 二分查找算法

二分查找法&#xff1a;在我的理解中這個查找方法為什么會叫二分呢&#xff0c;我認為是將要查詢的一個列表分成了兩份&#xff0c;然后在利用某個值來進行比較&#xff0c;在一個不斷循環的過程中來找出我們要找的某一個值。 廢話不多說&#xff0c;先上代碼&#xff1a; 1 de…

面試題

1. block 的作用由來&#xff0c;跟delegate的區別。 2. swift 的枚舉。 3. iOS保存一個對象。轉載于:https://www.cnblogs.com/studyNT/p/7499779.html

ssm框架下文件上傳

springmvc實現文件上傳的步驟&#xff1a; 1.頁面上&#xff0c;通過input來準備file組件&#xff0c;該標簽&#xff0c;必須給定name屬性值 同時&#xff0c;要求form表單必須給定一個屬性&#xff1a;enctype"multipart/form-data" 2.在pom.xml文件中&#xff0c;…

MySQL via EF6 的試用報告

MySQL via EF6 的試用報告1、如何通過 EF6 來連接 MySQL&#xff1f;2、如何通過 EF6 來實現 CRUD&#xff1f;2.1、Create 添加2.2、Retrieve 查詢2.3、Update 修改2.4、Delete 刪除3、如何更好的運用 EF6 來完成工作&#xff1f;3.1、傳說中 EF 的三種模式3.2、EF6 執行原生 …

Java暑假作業

一.《大護法》觀影有感 ... 從預告開始就期待著這部影片&#xff0c;在看過一遍后又忍不住二刷&#xff0c;影片觀看至第二遍后&#xff0c;對于全片的脈絡也更清晰了一點&#xff0c;雖然打著暴力美學的旗子&#xff0c;但《大護法》偏偏更文藝一些。文藝片是沒有對錯的&a…

使用EasyNetQ組件操作RabbitMQ消息隊列服務

RabbitMQ是一個由erlang開發的AMQP(Advanved Message Queue)的開源實現&#xff0c;是實現消息隊列應用的一個中間件&#xff0c;消息隊列中間件是分布式系統中重要的組件&#xff0c;主要解決應用耦合&#xff0c;異步消息&#xff0c;流量削鋒等問題。實現高性能&#xff0c;…

context-param和init-param的區別

http://www.cnblogs.com/hzj-/articles/1689836.html 轉載于:https://www.cnblogs.com/wangc04/p/7501054.html

TensorFlow 1.12.2 發布,修復 GIF 構造安全漏洞

開發四年只會寫業務代碼&#xff0c;分布式高并發都不會還做程序員&#xff1f; TensorFlow 1.12.2 發布了&#xff0c;此處本修復了一個潛在的安全漏洞&#xff1a; 精心設計的 GIF 圖像可以在解碼過程中產生空指針解引用更新說明&#xff1a; https://github.com/tensorflo…

【教程】如何在標簽打印工具TFORMer Designer中自定義布局?

TEC-IT的在線標簽生成器TFORMer Designer提供標簽打印服務&#xff0c;并提供即用型行業標簽模板作為Web服務。使用此軟件&#xff0c;您可以在幾秒鐘內創建您自己的標簽和表格或在工業和物流業中使用即時可用的模板。TFORMer Designer的最新更新現在允許使用自定義標簽布局。 …

對象變為指定格式的數組

拿到的對象的格式&#xff08;一個對象里面都好多屬性&#xff09; 想要轉換成的數據格式&#xff08;一個數組里面有好多個對象&#xff0c;每個對象有一個id和name的屬性&#xff09; 如何處理的 selectionChange(val) { // 列表選擇var dynamicTags1 [];var arr[]for(var i…

bootstrapValidator remote 驗證問題

1 加載jQuery和bootstrap.min.js 后引入bootstrapValidator.min.js字段驗證之remote 遠程驗證(類似ajax驗證)&#xff0c;返回值必須是 {"valid":true}{"valid":false} true表示 驗證通過 false 表示驗證不通過。 當添加remote 驗證后&#xff0c;驗證通過…

世界頂級的程序員們告訴你:這些書都是你應該讀的

在很早之前就想整理一份來自經驗豐富的頂級程序員推薦閱讀的書籍清單&#xff0c;全棧工程師Dmitry Shvetsov整理了Bob叔以及Jeff Atwood and DHH等世界知名程序員曾經在博客中推薦過的書單&#xff0c;下面我們就一起來看看深受大神們青睞的書籍都是哪些?世界頂級的程序員們告…