2016-10-19 72 views
1

對於工作我正在處理文件導出。數據全部導出正常,但是關心的是沒有文件對話框出現,並且沒有來自瀏覽器的文件已被下載的指示。瀏覽器不顯示文件已下載

我的文件下載包含兩個ajax處理程序和一些javascript。 我的按鈕有一個onclick事件,它調用generateReport,它將一個微調器放在頁面上並調用Handler。該處理程序準備數據並將其保存到文件中。

一旦完成,javascript會調用第二個處理程序來檢索已保存的文件,並且應該將其發送給用戶,並提示他們保存該文件。第二個處理程序被調用並且不會引發錯誤。

我的第二個(不工作)的處理程序是在這裏:

baseDir = ProjectConfig.BaseShareFolderPath 
     Dim fileStream As FileStream = New FileStream((baseDir + "\" + filePath), FileMode.Open, FileAccess.Read) 
     Dim bytes As Byte() 
     Dim binaryReader As BinaryReader = New BinaryReader(fileStream) 

     bytes = binaryReader.ReadBytes(fileStream.Length) 
     fileStream.Close() 
     fileStream.Dispose() 
     binaryReader.Close() 

     Dim fileName As String = filePath.Substring(filePath.IndexOf("\Crm") + 1) 
     context.Response.ContentType = "xls" 
     context.Response.AppendHeader("content-disposition", "attachment;filename=" & fileName) 
     context.Response.OutputStream.Write(bytes, 0, bytes.Length) 
     context.Response.OutputStream.Flush() 
     context.Response.OutputStream.Close() 
     context.Response.End() 

任何人都可以看到任何理由,這將不提示與文件對話框的用戶?我們在其他項目中使用類似的代碼,我的似乎缺少一些小部分。

+0

什麼JavaScript代碼是從前端調用此?它是用ajax還是窗口重定向完成的? –

+0

我還建議將'filePath.Substring(filePath.IndexOf(「\ Crm」)+ 1)'改爲'System.IO.Path.GetFileName(filePath)' –

+0

這是一個ajax調用,我會研究該GetFileName –

回答

0

無法使用ajax將文件下載到客戶機。

在您的JavaScript腳本中,您需要使用window.location.replace(downloadUrl)window.open(downloadUrl)。後者將打開一個新窗口來下載文件,第一個將使用當前窗口執行下載。

參考:Download a file by jQuery.Ajax

+0

因此,我將不得不做一個隱形頁面與一些URL將下載文件?讓ajax調用window.open(url),然後爲那個URL在Page_Load方法中有我的處理程序邏輯? –

+0

只要對該調用的響應是具有正確響應標頭的文件,您就可以將它指向與您用於調用ajax的網址完全相同的網址。您不需要使用新頁面。 –

+0

我唯一的問題是我不是指向一個url,而是一個磁盤上的路徑。所以我讓它返回正確的路徑,它只是打開一個空白窗口。 –

0

您的ContentType(MIME類型)看起來不正確。試試這個:

context.Response.ContentType = "application/vnd.ms-excel" 
+0

不幸的是,這仍然沒有任何。我的第一個處理程序強制文件到磁盤,這很好,但爲什麼第二個處理程序可以不抓取同一個文件並將其提供給用戶? –