黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國(guó)咨詢/投訴熱線:400-8080-105
動(dòng)力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁(yè) hot資訊 關(guān)于Struts2文件下載的介紹

關(guān)于Struts2文件下載的介紹

更新時(shí)間:2022-02-10 08:39:45 來源:動(dòng)力節(jié)點(diǎn) 瀏覽1144次

文件下載路徑問題,項(xiàng)目運(yùn)行時(shí)MyEclipse會(huì)加載Tomcat的webapps目錄下的項(xiàng)目。所以,關(guān)于路徑問題(一定要設(shè)置相對(duì)路徑強(qiáng)度)

下載到本地服務(wù)器需要相對(duì)路徑。最好使用絕對(duì)路徑上傳到客戶端

上傳文件需要很多包。

1. Struts 2 支持文件下載

Struts 2 支持通過 org.apache.slruts2.dispatcher.Stream ResuIt 的結(jié)果類型下載文件。

它使下載易于編寫的程序變得更加容易。

StreamResuIt 結(jié)果類型使用 HttpServletResponse 對(duì)象返回的 ServletOutputStrcam 對(duì)象,將下載文件的二進(jìn)制數(shù)據(jù)輸出到客戶端,有以下參數(shù):contentType發(fā)送到 Web 瀏覽器的數(shù)據(jù)流的 MIME 類型(默認(rèn)為 text/plain)是下載文件的內(nèi)容類型。

當(dāng)客戶端向Tomcat請(qǐng)求靜態(tài)資源時(shí),Tomcat會(huì)自動(dòng)在Response Head中添加“Content-Type”屬性,并配置具體屬性列表。

contentLength

數(shù)據(jù)流的長(zhǎng)度,以字節(jié)為單位(瀏覽器顯示進(jìn)度條),即下載文件的長(zhǎng)度

contentDisposition:

該屬性配置下載文件的文件名等屬性,其中文件類型分為inline和attachment: 1.inline:瀏覽

器嘗試直接打開文件(默認(rèn)值)

2.attachment:瀏覽器下載直接作為附件

也不是絕對(duì)的。這適用于瀏覽器可以顯示的下載。對(duì)于瀏覽器不支持的下載,即使使用了內(nèi)聯(lián)選擇。

項(xiàng)目仍會(huì)彈出文件下載對(duì)話框。contentDispostion 的默認(rèn)值是 inline。

inputName

Action 中用于下載文件的屬性名稱,類型為 InputStream。默認(rèn)識(shí)別為 inputStream

inputName:用于指定下載文件的輸入流入口,需要在Action中指定。也就是說需要action定義對(duì)應(yīng)的屬性類型InputStream。默認(rèn)為輸入流。

如果在Action中聲明了getInputStream()方法,則在配置文件struts.xml中配置為<param name="inputName">inputStream</param>。

如果在 Action 中聲明了 getTargetFile() 方法,則配置文件 struts.xml 配置為<param name="inputName">targetFile </param>。

bufferSize

文件數(shù)據(jù)從輸入復(fù)制到輸出的緩沖區(qū)大小,默認(rèn)1024字節(jié)

allowCaching

是否允許緩存

StreamResult 結(jié)果類型已在 struts-default 文件中定義為邏輯名稱流。

<結(jié)果名稱=“成功”類型=“流”>
				<param name="contentType">文本/純文本</param>
				<param name="inputName">輸入流</param>
                //這里的filename就是要下載的文件名。
				<param name="contentDisposition">附件;filename="hello.txt"</param>
				<param name="bufferSize">1024</param>
			</結(jié)果>

案例

  <正文>
	<s:調(diào)試/>
	<s:a href="download?fileName=a.txt">下載一種方式</s:a>
	<a href="download?fileName=a.txt">向下模式二</a>
  </正文>
公共類 DownloadAction 擴(kuò)展 ActionSupport {
	私有字符串文件名;
	公共輸入流 getInputStream() 拋出 IOException {
		字符串路徑 = ServletActionContext.getServletContext().getRealPath(fileName);
		/**
		 * 方法1 File file = new File(路徑);返回新的文件輸入流(文件);
		 * 方法二 FileUtils.openInputStream(file);
		 */
		文件文件 = 新文件(路徑);
		返回 FileUtils.openInputStream(file);
	}
	公共字符串 getFileName() {
		返回文件名;
	}
	公共無效 setFileName(字符串文件名){
		this.fileName = 文件名;
	}
	@覆蓋
	公共字符串執(zhí)行()拋出異常{
		返回 super.execute();
	}
	公共無效setInputStream(輸入流輸入流){
	}
}
	    <動(dòng)作
			名稱="下載"
			類="action.DownloadAction">
			<結(jié)果名稱=“成功”類型=“流”>
				<param name="contentType">文本/純文本</param>
				<param name="inputName">輸入流</param>
				<param name="contentDisposition">附件;filename="hello.txt"</param>
				<param name="bufferSize">1024</param>
			</結(jié)果>
		</行動(dòng)>

此時(shí),不要忘記導(dǎo)入包,以及導(dǎo)入哪個(gè)包的FileUtils,仔細(xì)看import org.apache.commons.io.FileUtils;

缺點(diǎn)或改進(jìn)

缺點(diǎn)

如果要下載任意目錄下的文件(不僅僅是Web應(yīng)用目錄),只需要修改action返回文件輸入流的方式,比如return new FileInputStream(inputPath)。

在實(shí)際應(yīng)用中,下載的文件不應(yīng)該配置在struts.xml文件中。如果是這樣,則相當(dāng)于將 FileDownloadAction 的功能限制為僅下載一個(gè)文件。下載文件的選擇應(yīng)該通過編碼來實(shí)現(xiàn)。根據(jù)瀏覽器的下載請(qǐng)求,查詢配置文件或數(shù)據(jù)庫(kù),獲取真正的下載文件數(shù)據(jù),構(gòu)造inputStream對(duì)象。

對(duì)于下載的文件名和下載的文件類型,它們是在struts.xml 文件中配置的。如果用戶要下載的文件類型很多,這種方式顯然不夠靈活。

改進(jìn)

為了動(dòng)態(tài)設(shè)置文件類型和下載文件名,我們可以寫一個(gè)攔截器,在Action執(zhí)行前動(dòng)態(tài)添加StreamResult的參數(shù),執(zhí)行結(jié)果。

為了在結(jié)果執(zhí)行之前攔截調(diào)用,我們需要使用 PreResultListener 接口,可以通過 Action lnvocation 注冊(cè)該接口,并在結(jié)果執(zhí)行之前獲取回調(diào)。PreResultListener 需要在攔截器中注冊(cè),所以我們需要編寫一個(gè)攔截器,然后

在攔截器方法中注冊(cè)一個(gè) PreResultListener 實(shí)例。

下載文件時(shí)出錯(cuò)

java.lang.IllegalArgumentException:在調(diào)用堆棧中找不到名稱為 [inputStream] 的 java.io.InputStream。
檢查為此操作指定的 <param name="inputName"> 標(biāo)記。
	在 org.apache.struts2.result.StreamResult.doExecute(StreamResult.java:234)
ERROR DefaultDispatcherErrorHandler 處理請(qǐng)求時(shí)發(fā)生異常:
java.lang.IllegalArgumentException:在調(diào)用堆棧中找不到名稱為 [inputStream] 的 java.io.InputStream。
 檢查為此操作指定的 <param name="inputName"> 標(biāo)記。

這是因?yàn)?ServletActionContext.getServletContext().getResourceAsStream(path+fileName); 返回值為空。

也就是說,文件的路徑不對(duì)。如果大家對(duì)此比較感興趣,想了解更相關(guān)知識(shí),可以關(guān)注一下動(dòng)力節(jié)點(diǎn)的Struts2視頻教程,里面還有更豐富的知識(shí)等著大家去學(xué)習(xí),希望對(duì)大家能夠有所幫助。

提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)

免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 小黄鸭视频破解版 | 91高清国产经典在线观看 | 黄色片视频在线 | 国产精品九九九久久九九 | 国产精品久久久久一区二区 | 中文字幕无线码欧美成人 | 在线日本三级 | 国产一区免费视频 | 日韩中文字幕不卡 | 免费看大片视频 | 欧美日韩视频在线成人 | 最近中文字幕大全免费版在线 | 五月婷视频 | 午夜看黄网站免费 | 成人国产精品免费视频不卡 | 日韩精品福利片午夜免费 | 欧美性精品| 一级爱视频 | 精品国产不卡一区二区三区 | 久久综合九色综合97小说 | 一个人在线看的免费视频 | 中文字幕在线成人免费看 | 成人在线毛片 | 国产啪| 亚洲天天看 | 成年人免费视频网站 | 久久久国产精品网站 | 成人 ftp| 亚洲国产精品热久久2022 | 男女上下爽无遮挡午夜免费视频 | 最近中文字幕国语免费高清6 | 久久永久免费视频 | 国产精品久久久久久久午夜片 | 香蕉视频黄网站 | 97天天摸天天碰天天爽 | 国产精品成人在线播放 | 91精品综合久久久久久五月天 | 亚洲日本中文字幕天天更新 | 成人免费夜片在线观看 | 欧美性生交xxxxx丝袜 | 亚洲国产成人资源在线软件 |