2014-06-12 76 views
2

的Web API我有一個返回文件流下載文件,使用jQuery後

[HttpPost] 
public HttpResponseMessage DownloadDocument([FromBody] parameters) 
    { 
     try 
     { 
      var stream = FileHelper.GetFilesStream(fileUrl); 
      HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK) { Content = new StreamContent(stream) }; 
      result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment"); 
      result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); 
      result.Content.Headers.ContentDisposition.FileName = fileName; 
      return result; 
     } 
     catch (Exception) 
     { 
      return Request.CreateErrorResponse(HttpStatusCode.NotFound, "File Not Found"); 
     } 
    } 

我如何可以調用jQuery中的Ajax這種方法來下載文件,保存文件對話框會彈出一個網絡API函數。我正在使用knockout.js,在按鈕的單擊事件處理程序中,我調用了這個WebAPI方法,並且獲取了流,但是我不知道如何將它保存到文件中。

+1

你需要將其更改爲得到 – Anders

+2

我需要在數據發佈某些對象。不能這樣做與獲取查詢字符串 –

+0

http://stackoverflow.com/questions/3499597/javascript-jquery-to-download-file-via-post-with-json-data – Anders

回答

0

您可以通過修改如何將數據發送到您的webapi來解決此問題。

在你的Javascript中,你可以創建一個隱藏的表單並追加你需要的數據,然後提交它。

示例代碼CoffeeScript中呈現,但應該很容易讀/轉換:

downloadDocument: (fileUri, otherProp, successCallback) => 
    if $('#hidden-form').length > 0 
     $('#hidden-form').remove() 

    $('<form>').attr(
     method: 'POST', 
     id: 'hidden-form', 
     action: '/your/url/to/method' 
    ).appendTo('body'); 

    $('<input>').attr({ 
     type: 'hidden', 
     id: 'fileUri', 
     name: 'fileUri', 
     value: fileUri 
    }).appendTo('#hidden-form') 
    $('<input>').attr({ 
     type: 'hidden', 
     id: 'otherProp', 
     name: 'otherProp', 
     value: otherProp 
    }).appendTo('#hidden-form') 

    $('#hidden-form').bind("submit", successCallback) 
    $('#hidden-form').submit() 

話,我也會創造出被認爲在爲您的WebAPI控制器參數的DTO的對象,而不是從閱讀請求正文:

public DownloadDocumentDTO 
{ 
    public string fileUri {get;set;} 
    public object otherProp {get;set;} 
} 

[HttpPost] 
public HttpResponseMessage DownloadDocument(DownloadDocumentDTO _dto) 
{ 
    .... 
} 

控制器方法中的代碼應該沒問題。 需要注意的是,如果你想傳遞更復雜的數據(不知道你是否因爲沒有提到而做),那麼你將需要添加更多的輸入到隱藏的表單,它不適用於傳遞反對。

+0

感謝您的時間,雖然我需要在身體傳遞的參數數量爲20左右。 –

1

AFAIK你不能直接通過JQuery下載文件。解決此問題的辦法是在HTML聲明一個隱藏的iframe:

<iframe id='hiddenIframe' src="" style="display:none; visibility:hidden;" ></iframe> 

當您單擊下載按鈕/鏈接,然後在jQuery的,你可以簡單地做設定的iframe來源:

$('#downloadButton').click(function(){ 
    $('#hiddenIframe').attr('src', 'api/DownloadDocument'); 
}) 
+1

'/ api/DownloadDocument'作爲帖子不工作得到。 –

2

您無法從ajax調用下載文件。您將需要使用獲取請求來下載文件。

你可以做的是使用你的ajax後,如上所述,但將文件保存在數據庫中,然後返回與文檔或URL的ID下載文檔的JSON。然後你可以添加一個隱藏的iframe來下載文檔。

看一看這個答案展示瞭如何做到這一點:https://stackoverflow.com/a/16086443/2326610

+0

感謝您的回答。 @Thewads的答案是相似的如此標記以致被接受。 –