2012-05-16 52 views
2

我有我打電話用這個很基本的js代碼的通用處理器:重定向響應下載文件

var formData = new FormData(); 

    formData.append("fileId", this.model.get("id")); 

    xhr = new XMLHttpRequest(); 

    xhr.open('POST', '/genericHandlers/DownloadFile.ashx'); 

    xhr.onload = function() { 
     if (xhr.status === 200) { 
      // Do something here? 
     } 
    } 

    xhr.send(formData); 

我一般的處理程序代碼似乎看行給我。基本上我試圖構建響應頭,我認爲當這個處理程序返回它將開始下載文件。

處理程序代碼:

var fileId = context.Request.Form["fileId"]; 

    // File stored in the db as a byte array 

    var file = (from f in dataContext.OneEVA_Docs_File_Storages 
      where Equals(f.ID, fileId) 
      select f).FirstOrDefault(); 

    context.Response.Clear(); 

    context.Response.AddHeader("Content-Type", file.ContentType); 
    context.Response.AddHeader("Content-Length", file.ContentLength.ToString()); 

    context.Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}; size={1}", file.Name, file.ContentLength)); 

    context.Response.BinaryWrite(file.File_Image.ToArray()); 
    context.Response.Flush(); 

    context.Response.End(); 

XHR請求完成確定。以下是我回復的回覆標題:

Cache-Control:private 
Connection:Close 
Content-Disposition:attachment; filename=Mikes File; size=1860113 
Content-Length:1860113 
Content-Type:image/jpeg 
Date:Wed, 16 May 2012 14:08:01 GMT 
Server:ASP.NET Development Server/10.0.0.0 
X-AspNet-Version:4.0.30319 

我錯過了什麼?我究竟做錯了什麼?

+0

什麼問題?文件沒有被放入響應中嗎? – sinni800

+0

@ sinni800它只是回來,沒有下載。 –

回答

1

這不會在瀏覽器中開始下載。使用POST請求很難實現。如果您只傳遞一個ID,它可以不是一個GET請求嗎?那麼你只是做

document.location.href = '/genericHandlers/DownloadFile.ashx?id=' + this.model.get("id"); 
+0

這很好。謝謝。在這種情況下,你能看到使用'GET'而不是'POST'的缺點嗎? –

+0

我想缺點是我無法做任何錯誤處理,就像例如文件不存在一樣。 –

+0

@MikeFielden你可以 - 如果文件不存在,只需提供錯誤頁面或重定向,而不是提供下載。當然,這意味着離開頁面。在向用戶提供點擊鏈接之前,可能檢查您的文件是否存在。 –