2014-09-05 76 views
1

我的Webapi創建動態zip文件。我想能夠下載該文件。目前我正在嘗試使用微風,但似乎它不可能。使用微風下載zip文件

我做了一個簡單的例子,只是從我的硬盤上打開zip文件,然後我在我的webapi中返回二進制內容。

public HttpResponseMessage GetFile() 
    { 
     var path = @"C:\myFolder\ myfile.zip"; 
     HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK); 
     var stream = new FileStream(path, FileMode.Open); 
     result.Content = new StreamContent(stream); 
     result.Content.Headers.ContentType = 
      new MediaTypeHeaderValue("application/x-zip-compressed"); 
     result.Content.Headers.Add("content-disposition", "attachment; filename=sendMyFileToClient.zip"); 
     return result; 
    } 

然後在我的視圖模型我使用微風來調用這個方法的WebAPI

var query = EntityQuery.from("GetFile"); 
     manager.executeQuery(query).then(function() { 
      alert("Downloaded file"); 
     }).fail(function() { alert("Not downloaded"); }); 

有人能告訴我們,如果我不能在微風中做到這一點,那麼請讓我知道如果我可以使用Ajax請求下載還是其他方式?我無法在谷歌上找到很多。

回答

0

Breeze不知道如何處理你的二進制數據,所以它不會有太大的幫助。而且您無法使用JavaScript下載和保存文件,因爲瀏覽器的沙盒不允許JavaScript訪問文件系統。

從根本上說,您需要將window.location設置爲您的服務器文件/資源​​的URL,以便瀏覽器將其下載並讓用戶保存它。要保留SPA的單頁,請設置iframe的window.location而不是主窗口。

還有一些其他的細節需要考慮,尤其是在錯誤處理方面。考慮使用像this SO answer中提到的jQuery File Download Plugin之類的東西。

+0

我的問題是,zip文件在內存中 – Happy 2014-09-09 10:12:32

+0

創建你能刪除你的答案,因爲我已經發布了新的問題http:// stackoverflow。com/questions/25747016 /正在下載的zip文件正在下載其實我想刪除這個問題 – Happy 2014-09-09 14:21:18

0

我發現這個問題,因爲我也是1)想從服務器下載文件,2)該文件在服務器上的內存和3)我使用微風。而且,我同意施密特先生的微風無法做到這一點。它似乎只能返回一個對象列表(記錄) - 這對於微風來說是有意義的......用於數據訪問。

而且,就像我一樣,我想你想知道如何下載帶有的文件而不需要微風。除了通過微風,我不熟悉網絡通信。我想知道如何將文件下載到目前爲止通過微風和服務器訪問數據的客戶端,目前爲止只能從微風接受查詢。我不知道客戶端和服務器是否被鎖定在微風中。由於答案似乎並非如此,我感到很天真。

如何爲微風客戶機/服務器下載文件的答案是:不要使用微風!在微風生態系統之外使用一些機制。我想對於一個經驗豐富的Web開發人員來說,這可能是顯而易見的,但是對於我來說,在我職業生涯的前25年裏,他仍然對Web技術一無所知。

我不知道這是否回答你的問題。至少這可能對遇到這個問題的其他人有用。

至於你如何下載文件,我猜測有很多關於這個問題的SO問題,博文和文章。但是,我會分享我提出的解決方案...... FWIW。

Server代碼:採用了棱角分明的$ HTTP通信電子服務

[HttpPost] 
public HttpResponseMessage RelatedRegistrationsFromRegistration() 
{ 
    var httpContent = new ByteArrayContent(...); 
    httpContent.Headers.ContentType = new MediaTypeHeaderValue("Application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); 
    httpContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") 
    { 
     FileName = "Related Registrations.xlsx" 
    }; 
    return new HttpResponseMessage(HttpStatusCode.OK) { Content = httpContent }; 
} 

客戶端代碼:

this.downloadFromUrl = function (url, refs) { 
    $http({ 
     method: 'POST', 
     url: url, 
     data: serializeData({ 'refs': refs }), 
     headers: { 
      'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' 
     }, 
     responseType: 'arraybuffer' 
    }).success(function (data, status, headers) { 
     var filename = headers('content-disposition').split('=')[1].replace(';', ''); 
     var blob = new Blob([data], { type: headers('content-type') }); 
     if (navigator.msSaveBlob) { 
      navigator.msSaveBlob(blob, filename); 
     } else { 
      var link = document.createElement('a'); 
      link.href = URL.createObjectURL(blob); 
      link.setAttribute('download', filename); 
      link.click(); 
      link.remove(); 
     } 
    }).error(function() { 
     alert('Error'); 
    }); 
}