欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

jsp中實(shí)現(xiàn)文件下載兩種方法-創(chuàng)新互聯(lián)

jsp中實(shí)現(xiàn)文件下載           

            

創(chuàng)新互聯(lián)主營沅陵網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都App定制開發(fā),沅陵h5小程序制作搭建,沅陵網(wǎng)站營銷推廣歡迎沅陵等地區(qū)企業(yè)咨詢

轉(zhuǎn)自:http://aguu125.iteye.com/blog/352314

(一)
最簡單的方式是在網(wǎng)頁上做超級鏈接,如:<a href="music/abc.mp3">點(diǎn)擊下載</a>。
但是這樣服務(wù)器上的目錄資源會直接暴露給最終用戶,會給網(wǎng)站帶來一些不安全的因素。

因此可以采用其它方式實(shí)現(xiàn)下載,可以采用:
1、RequestDispatcher的方式進(jìn)行;
2、采用文件流輸出的方式下載。 (推薦)

1、采用RequestDispatcher的方式進(jìn)行
<% 
 response.setContentType("application/x-download");//設(shè)置為下載application/x-download 
 String filedownload = "/要下載的文件名";//即將下載的文件的相對路徑 
 String filedisplay = "最終要顯示給用戶的保存文件名";//下載文件時(shí)顯示的文件保存名稱 
 String filenamedisplay = URLEncoder.encode(filedisplay,"UTF-8"); 
 response.addHeader("Content-Disposition","p_w_upload;filename=" + filedisplay); 
    
 try 
 { 
 RequestDispatcher dis = application.getRequestDispatcher(filedownload); 
 if(dis!= null) 
 { 
 dis.forward(request,response); 
 } 
 response.flushBuffer(); 
 } 
 catch(Exception e) 
 { 
 e.printStackTrace(); 
 } 
 finally 
 { 
    
 } 
%> 

2、采用文件流輸出的方式下載 
<%@page language="java" contentType="application/x-msdownload" pageEncoding="gb2312"%> 
<% 
 //關(guān)于文件下載時(shí)采用文件流輸出的方式處理: 
 //加上response.reset(),并且所有的%>后面不要換行,包括最后一個(gè); 
 
 response.reset();//可以加也可以不加 
 response.setContentType("application/x-download"); 
 
//application.getRealPath("/main/mvplayer/CapSetup.msi");獲取的物理路徑 
 
String filedownload = "想辦法找到要提供下載的文件的物理路徑+文件名"; 
String filedisplay = "給用戶提供的下載文件名"; 
 String filedisplay = URLEncoder.encode(filedisplay,"UTF-8"); 
 response.addHeader("Content-Disposition","p_w_upload;filename=" + filedisplay); 
 
 java.io.OutputStream outp = null; 
 java.io.FileInputStream in = null; 
 try 
 { 
 outp = response.getOutputStream(); 
 in = new FileInputStream(filenamedownload); 
 
 byte[] b = new byte[1024]; 
 int i = 0; 
 
 while((i = in.read(b)) > 0) 
 { 
 outp.write(b, 0, i); 
 } 
//   
outp.flush(); 
//要加以下兩句話,否則會報(bào)錯(cuò) 
//java.lang.IllegalStateException: getOutputStream() has already been called for //this response   
out.clear(); 
out = pageContext.pushBody(); 

 catch(Exception e) 
 { 
 System.out.println("Error!"); 
 e.printStackTrace(); 
 } 
 finally 
 { 
 if(in != null) 
 { 
 in.close(); 
 in = null; 
 } 
//這里不能關(guān)閉   
//if(outp != null) 
 //{ 
 //outp.close(); 
 //outp = null; 
 //} 
 } 
%> 

對于第二種方法,我認(rèn)為應(yīng)該是比較常用的。不過有幾個(gè)地方是值得我們注意的:

一、采用第二種方法的主要優(yōu)點(diǎn)是實(shí)際文件的存放路徑對客戶端來說是透明的。
這個(gè)文件可以存在于任何你的服務(wù)器能夠取得到的地方,而客戶端不一定能直接得到。例如文件來自于數(shù)據(jù)庫或者內(nèi)部網(wǎng)絡(luò)的一個(gè)FTP服務(wù)器。換句話說,這種方式可以實(shí)現(xiàn)隱藏實(shí)際文件的URL地址。

二、為了防止客戶端瀏覽器直接打開目標(biāo)文件(例如在裝了MS Office套件的Windows中的IE瀏覽器可能就會直接在IE瀏覽器中打開你想下載的doc或者xls文件),你必須在響應(yīng)頭里加入強(qiáng)制下載的MIME類型:
response.setContentType("application/force-download");//設(shè)置為下載application/force-download
這樣,就可以保證在用戶點(diǎn)擊下載鏈接的時(shí)候?yàn)g覽器一定會彈出提示窗口來詢問你是下載還是直接打開并允許你選擇要打開的應(yīng)用程序,除非你設(shè)置了瀏覽器的一些默認(rèn)行為。
或者,你想讓客戶端自行處理各種不同的文件類型,你可以在服務(wù)器的配置文件中配置MIME類型映射,通過簡單的判斷文件后綴名來處理。例如,在Tomcat中設(shè)置MIME響應(yīng)類型:
如果文件在客戶端中的響應(yīng)程序類型和期望不一致,修改$TOMCAT_HOME\conf\web.xml文件中的如下部分 :
<mime-mapping>
 <extension>zip</extension>
 <mime-type>application/zip</mime-type>
</mime-mapping>
<mime-mapping>
 <extension>mht</extension>
 <mime-type>message/rfc822</mime-type>
</mime-mapping>
……

三、在響應(yīng)頭中盡量不要設(shè)置瀏覽器緩存期限。
有時(shí)候用戶在點(diǎn)擊了下載鏈接后,在彈出窗口中,用戶想直接點(diǎn)擊“打開”,而不想保存到指定路徑。這時(shí)候如果我們在響應(yīng)頭中限制了不允許使用瀏覽器緩存(即總是刷新),在IE瀏覽器中我們將無法直接打開該文件。因?yàn)橄拗屏瞬辉试S使用緩存,瀏覽器無法將文件保存到臨時(shí)文件夾(即緩存)。
也就是說,在響應(yīng)頭中不要進(jìn)行如下的設(shè)置(已注釋):
 //response.addHeader("pragma","NO-cache");
 //response.addHeader("Cache-Control","no-cache");
 //response.addDateHeader("Expries",0);

四、文件名為中文或其他unicode字符時(shí)的處理。
有時(shí)候提供下載的文件名中包含中文字符或者其他unicode字符,會導(dǎo)致瀏覽器無法正確的采用默認(rèn)的文件名保存文件。我們應(yīng)該記住在響應(yīng)頭中包含filename字段并采用ISO8859-1編碼(推薦)或者采用UTF-8編碼:
response.setHeader("Content-disposition","p_w_upload; filename="+new String(filename.getBytes("UTF-8"),"iso8859-1")); //采用ISO8859-1編碼
response.setHeader("Content-disposition","p_w_upload; filename="+URLEncoder.encode(filename, "UTF-8")); //采用UTF-8編碼
但是,這種方式在不同的瀏覽器中表現(xiàn)也有所不同。例如在IE和Firefox中,采用ISO8859-1編碼可以正確顯示文件名,而在Opera中不管采用那種編碼,默認(rèn)保存的文件名都無法做到正確顯示。
所以最好的方法其實(shí)就是盡量在文件名中使用ascii編碼。

五、由于采用流的方式進(jìn)行輸入輸出,我們必須保證在使用完畢后關(guān)閉流的資源。
一般我們把關(guān)閉流的操作放在finally塊中,以保證在程序段結(jié)束前一定會關(guān)閉流的資源:

InputStream is = null;
ServletOutputStream sos = null;
try {
 is = ...; //通過某種方式讀進(jìn)數(shù)據(jù)到輸入流
 sos = response.getOutputStream(); //打開輸入流
 byte[] buff = new byte[2048];
 int bytesRead;
 while(-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
 sos.write(buff,0,bytesRead);
 sos.flush();
 }
} catch(IOException ex) {
 //TODO something with IOException
} catch(Exception ex) {
 //TODO something with Exception
} finally {
 if(is != null) {
 is.close(); //關(guān)閉輸入流
 }
 if(sos != null) {
 sos.close(); //關(guān)閉輸入流
 }
}

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

標(biāo)題名稱:jsp中實(shí)現(xiàn)文件下載兩種方法-創(chuàng)新互聯(lián)
當(dāng)前網(wǎng)址:http://chinadenli.net/article4/cohiie.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計(jì)公司小程序開發(fā)網(wǎng)站導(dǎo)航網(wǎng)站維護(hù)域名注冊靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)