1. 程式人生 > >解決頁面下載檔案,資源不存在頁面出現空白的問題。

解決頁面下載檔案,資源不存在頁面出現空白的問題。

框架和環境:ssm+maven3.0+db2+easyui1.4+jdk1.7

功能背景:第一步是通過定時輪詢把封閉系統請求的入參報文生成檔案放到共享盤的目錄。同時把檔案的路徑資訊存到資料庫表。第二步就是我這個頁面的功能,把生成的檔案資訊列表顯示並可以選中下載檔案列表。但是發現如果這個檔案已經刪除,點選下載後由於資源不存在後臺異常,雖然做了處理,但是頁面就會出現空白。

實現頁面檔案下載的思路:查詢的時候把每個檔案的路徑也查出來,在頁面進行隱藏,等到下載的時候把檔案對應路徑傳到後臺,後臺依據這個路徑可以找到檔案,並讀取寫到頁面,實現下載功能。

1.頁面點選下載觸發的方法。主要同過window.location.href=“”來進行連結方式下載。之前的博文有介紹post方法無法完成檔案下載。

function downloadOrderExport(){
    var row=$("#dataTable").datagrid('getSelected');   
    if(row !=null){
        var filepath=escape(encodeURIComponent(row.filePath));
        window.location.href=basePath+"/orderExport/downloadAndUpdate?filePath="+filePath;
    }else{
        $.messager.alert('提示'
,'請選擇一條你要下載的記錄!'); } }

2.具體Controller層的方法為void,這也是不同於StringL型別返回值的最大區別和難點。由於無法用return,只能用response轉跳到另一個Controller,然後返回頁面:

@RequestMapping("/download")
    public void downloadXmlFile(HttpServletRequest request,HttpServletResponse response){
        String filePath=request.getParameter("filePath"
); //為防止檔名亂碼,這裡進行處理 try { filePath=URLDecoder.decode(filePath,"utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } File file=new File(filePath); String fileName=file.getName(); try{ InputStream fis=new BufferedInputStream(new FileInputStream(filePath)); byte[] buffer=new byte[fis.available()]; fis.read(buffer); fis.close(); //清空response response.reset(); //設定response的Header response.setHeader("Content-Disposition","attachment;filename="+new String(fileName.getBytes())) response.setHeader("Content-length",""+file.length()); OutputStream toClient=new BufferedOutputStream(response.getOutputStream()); response.setContentType("application/octet-stream"); toClient.write(buffer); toClient.flush(); toClient.close(); }catch(Exception e){ logger.error("檔案下載出錯。"+e.getMessage(),e); //檔案不存在時會在FileinputStream(filePath)讀取時異常,進入這裡。導致前臺頁面無響應。這裡就進行重定向到原頁面,並帶上錯誤標記 try{ //request.getCOntextPath()獲取專案名,這個必須加上,不然找不到對應path的方法。頁面404,這個path對應本類的另一個方法(在下面有) response.sendRedirect(request.getCOntextPath()+"/orderExport/toOrderExport?error=error"); }catch(IOException e1){ logger.error(e1); } } } //轉跳到下載的主頁面 @RequestMapping("/toOrderExport") public String jumpToOrderExportJsp(){ return "/orderExport/orderExportIndex"; }

3.經過前兩步,如果要下載的檔案有異常,就會進入異常處理模組—通過response請求轉發到前臺下載頁面。但是問題來了:我們是通過window.location.href進行後臺。並沒有回撥函式的功能,該如何接收後臺的入參呢?答案是在頁面每次載入時進行異常標記的判斷!js程式碼如下:

$(function(){
    function getQueryString(param){
        var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");
        var r = window.location.search.substr(1).match(reg);
        if(r!=null){
            $.messager.alert('提示','你下載的檔案不存在!');
        } 
    }

    getQueryString("error");

})

總結:

1.針對重定向-redirect在ssm的controller層使用分為兩種:一種是方法有返回值,一般為String,重定向用return “請求地址”即可;另一種方法是無返回值void,只能用response.sendRedirect(request.getContextPath+”請求地址”)
針對String型別的重定向,這篇博文:spring mvc controller間跳轉 重定向 傳參講的比較清楚。分帶引數和不帶引數兩種。

2.正常的從後臺我們拿到的都是集合,map等,但是接觸後臺重定向請求前臺的很少,帶引數返回前臺的就更少/orderExport/toOrderExport?error=error。我這裡就是獲取個標記,只要error不為空就證明出現異常。那麼正常情況下該如何獲取後臺的請求引數呢?這裡有兩種方法供選擇。一種是正則方法,一種是傳統擷取的方法。推薦使用第一種。我這裡參考博文:獲取引數的方法

方法一:採用正則表示式獲取位址列引數:( 強烈推薦,既實用又方便!)

function GetQueryString(name)
{
     var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");
     var r = window.location.search.substr(1).match(reg);
     if(r!=null){
        return  unescape(r[2]); 
     }
    return null;
}

// 呼叫方法,獲取指定引數名的引數值
alert(GetQueryString("引數名1"));
alert(GetQueryString("引數名2"));
alert(GetQueryString("引數名3"));

下面舉一個例子:

若位址列URL為:abc.html?id=123&url=http://www.maidq.com

那麼,但你用上面的方法去呼叫:alert(GetQueryString(“url”));

則會彈出一個對話方塊:內容就是 http://www.maidq.com

如果用:alert(GetQueryString("id"));那麼彈出的內容就是 123 啦;

當然如果你沒有傳引數的話,比如你的地址是 abc.html 後面沒有引數,那強行輸出呼叫結果有的時候會報錯:
所以我們要加一個判斷 ,判斷我們請求的引數是否為空,首先把值賦給一個變數:

var myurl=GetQueryString("url");
if(myurl !=null && myurl.toString().length>1)
{
   alert(GetQueryString("url"));
}

這樣就不會報錯了!

方法二:傳統方法

<script type="text/javascript">
function UrlSearch() 
{
   var name,value; 
   var str=location.href; //取得整個位址列
   var num=str.indexOf("?") 
   str=str.substr(num+1); //取得所有引數   stringvar.substr(start [, length ]

   var arr=str.split("&"); //各個引數放到數組裡
   for(var i=0;i < arr.length;i++){ 
    num=arr[i].indexOf("="); 
    if(num>0){ 
     name=arr[i].substring(0,num);
     value=arr[i].substr(num+1);
     this[name]=value;
     } 
    } 
} 
var Request=new UrlSearch(); //例項化
alert(Request.id);
</script>

相關推薦

解決頁面下載檔案資源存在頁面出現空白的問題

框架和環境:ssm+maven3.0+db2+easyui1.4+jdk1.7 功能背景:第一步是通過定時輪詢把封閉系統請求的入參報文生成檔案放到共享盤的目錄。同時把檔案的路徑資訊存到資料庫表。第二步就是我這個頁面的功能,把生成的檔案資訊列表顯示並可以選

解決問題:由於擴充套件配置問題而無法提供您請求的頁面如果該頁面是指令碼請新增處理程式如果應下載檔案請新增 MIME 對映

WindowServer2012伺服器,新增角色安裝完.netframework和iis之後,執行aspx頁面就報如下錯誤: HTTP 錯誤 404.3 - Not Found 由於擴充套件配置問題而無法提供您請求的頁面。如果該頁面是指令碼,請新增處理程式。如果應下載檔

跳轉頁面下載檔案

最先網上答案討論比較多的是這一種: **通過iframe下載 /** * content 下載的url */ function download2(content) { try{  $(".iframe_down").remove().end();   var urlFile=conte

MongoDB匯入大的json、csv資料檔案匯入完全的解決方法

轉載文章:轉自:點選開啟“https://blog.csdn.net/qq_33206732/article/details/78788483#commentsedit” 昨天,做了一個東西,就是把生產上的mongodb資料使用mongoexport匯出了一個.json檔案用於本地做分析使用,裡

svc 報錯“由於擴充套件配置問題而無法提供您請求的頁面如果該頁面是指令碼請新增處理程式如果應下載檔案請新增 MIME 對映

問題: 系統沒有預設為 IIS 註冊 WCF 服務的 svc 檔案的 MIME 對映。 解決方法: 以管理員身份執行 cmd.exe 切換到目錄 C:\Windows\Microsoft.NET\Framework\v3.0\Windows Co

tomcat下 下載檔案下載地址含有中文解決辦法

(一)修改Tomcat配置檔案方法: 找到Tomcat 目錄,開啟config/server.xml檔案,新增一段程式碼即可。如紅色的字型   <Connector port="8080"               URIEncoding="utf-8"     

Orace的listener.ora檔案netca解決的話可以手工建立

有的時候netca命令不能很好使用的話,(DISPLAY的支援),可以手工建立該檔案,需要了解該檔案的存放位置/u01/app/oracle/product/11.2.0/db_1/network/admin/listener.ora # listener.or

Not Found 由於擴充套件配置問題而無法提供您請求的頁面如果該頁面是指令碼請新增處理程式如果應下載檔案請新增 MIME 對映

HTTP 錯誤 404.3 - Not Found 由於擴充套件配置問題而無法提供您請求的頁面。如果該頁面是指令碼,請新增處理程式。如果應下載檔案,請新增 MIME 對映。 執行:cmd,轉到C:\Windows\Windows Microsoft.Net \ Frame

Python實現斷點續傳下載檔案檔案下載還怕下載到一半就斷了嗎?存在!

這篇部落格簡單介紹python斷點續傳下載檔案,並加入花哨的下載進度顯示方法,涉及Python檔案操作的技巧,和一些函式庫的使用。 環境 Python 3.6 requests模組 對應檔案的下載連結 (要下載的檔案必須支援斷點續傳) (是不是很少東西

svc 報“由於擴充套件配置問題而無法提供您請求的頁面如果該頁面是指令碼請新增處理程式如果應下載檔案請新增 MIME 對映“的HTTP 錯誤 404.3 – Not Found

原因:系統沒有預設為IIS註冊WCF服務的svc檔案的MIME對映。 解決方法:管理員身份執行C:\Windows\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\ServiceModelReg.e

檔案字尾與Mime型別對照表/由於擴充套件配置問題而無法提供您請求的頁面如果該頁面是指令碼請新增處理程式如果應下載檔案請新增 MIME 對映

//文件檔案型別的 .ai application/postscript .eps application/postscript .exe application/octet-stream .doc application/vnd.ms-w

解決在.gitignore中新增忽略檔案忽略生效的方法

由於一些配置資訊的私密性,不方便提交配置資訊檔案。於是在.gitignore中新增檔案忽略,但是再次git status檢視提交前的資訊時,配置檔案(config.py)還是跟蹤到了: 後面查閱相關的資料才知道需要進行下面操作 git rm -r --cached . 實際操作如

pos方式下載檔案解決url引數過長問題

前端頁面下載檔案時候,如果以get方式提交,會受到url引數長度限制,所以改成構造form表單方式進行提交下載,已下是藉助form表單方式進行提交 function downloadImage() { $("#downloadform").remove(); var form =

在angular中一個頁面滾動後打開新頁面在最頂部的解決辦法

頂部 ima title 滾動 com http png 官方文檔 service 解決辦法:使用$anchorScroll 找到當前頁面的controller,在開頭中加入以下部分代碼,如圖所示: $anchorScroll的剩余用法請參考官方文檔: https://d

js 下載pdf檔案是開啟預覽 方案

專案需求 常規加上download 屬性 <a href="https://testmv.xesimg.com/ExpCourse/image/2018/10/09/15390717545791

解決jsp下載檔案報錯getOutputStream() has already及無法下載中文名稱標題的問題

下載的jsp程式碼 1、其中紫色部份解決,傳值中文亂碼問題 2、紅色部份解決,下載標題為中文的問題(2 種解決方法) 3、黃色背景部份解決下載點選取消或者下載過程中報錯(java.lang.IllegalStateException: getOutputStream() h

php 下載檔案考慮到各種格式解決下載時部分出現檔案損壞的問題

function dl_file($file){ //First, see if the file exists if (!is_file($file)) { die("<b>404 File not found!</b>")

ARM開發板執行執行檔案到庫報錯的解決方法

平臺:smart210 coretex A8 、Redhat6 這裡舉我的列子,其實不管你執行什麼可執行檔案遇到這種問題都是一樣的方法去解決的。 1、錯誤提示 問題所在:這種問題是掛載開發板的根檔案系統中缺少相應的庫,路徑(看自己的根檔案系統掛載到哪裡)如:

Java中動態載入properties檔案需要重啟應用的解決辦法

java中動態載入properties檔案,而不需要重啟應用的解決方法在Java專案中,如果需要使用.properties型別的檔案作為某些配置資訊存放介質的時候,一般都是將.properties檔案放在src目錄下,程式碼大部分都是這樣寫的: Properties pro

FTPClient上傳和下載檔案中文亂碼問題解決

 使用類:            org.apache.commons.net.ftp.FTPClient    問題描述:       建立中文目錄、上傳中文檔名時,目錄名及檔名中的中文顯示亂碼    解決方法:            在網上Google了一些