2012-12-18 92 views
4

文件我有這樣的事情在我看來:C#MVC返回JSON或AJAX調用

 var url = '@Url.Action("DownloadZip", "Program")' + '?programNums=' + selectedRow; 

     $.ajax({ 
      url: url, 
      dataType: 'json', 
      async: false, 
      success: function (data) { 
       if (data != "Successful") { 
        alert(data); 
       } 
      } 
     }); 

控制器可以返回一個文件或者如果有錯誤可以返回一個JSON的結果。 一直無法讓他們一起工作。

這裏是什麼樣子:

public ActionResult DownloadZip(string programNums) 
    { 

     if(string.IsNullOrEmpty(programNums)) 
     { 
      return Json("Error, blank info sent.", JsonRequestBehavior.AllowGet); 
     }    

     var memoryStream = new MemoryStream(); 

     using (var zip = new ZipFile()) 
     { 
      zip.AddFile("C:\\sitemap.txt"); 
      zip.Save(memoryStream); 
     } 

     memoryStream.Seek(0, 0); 
     return File(memoryStream, "application/octet-stream", "archive.zip"); 

    } 

我所看到的是,Ajax調用需要一個JSON值回。因爲在我的情況下,它返回一個文件,它不能工作。無論如何要處理我在做什麼,以便它可以從ajax調用中返回JSON或文件。

+0

在AJAX調用它被指定,其需要'json'作爲返回的類型。這與發送文件時返回的「application/octet-stream」不同。嘗試從ajax調用中刪除行'dataType:'json''? –

+0

謝謝謝恩 - 刪除dataType:json但沒有奏效。它返回了文件,但沒有可讀的格式。儘管關閉。 –

+0

我讀過AJAX不是下載文件的好方法。這裏是一個類似的問題[鏈接](http://stackoverflow.com/questions/7578124/jquery-ajax-call-for-pdf-file-download) –

回答

2

你有沒有考慮過將JSON傳回給一個文件Url?

如果該文件被成功找到/創建。通過指向文件的鏈接發送JSON結果。然後在javascript中使用windows.location來檢索文件。當出現錯誤時,JSON結果將包含錯誤信息,並且該信息可以顯示給用戶。爲此,您需要創建另一個可以流式傳輸文件的端點(操作)。

3

我想你會碰到這個實現的很多問題。您實際上無法通過AJAX上傳或下載文件。請參閱下面的鏈接。

How to download file from server using jQuery AJAX and Spring MVC 3

您應該使用上面粘貼的問題分享了兩個實現的一個。如果您使用IFRAME方法,則可以使用jQuery來檢查文檔何時完成以及是否成功。

編輯:你可以只拋出一個服務器異常(500)。你如何處理IFRAME中的500只取決於你。

2

您的代碼將無法工作,因爲您無法將二進制數據流式傳輸到Ajax請求 - 您沒有正常的響應上下文來寫入。

你可以採取幾種方法:

  1. 如果驗證通過,只返回一個新鏈接到另一個 處理程序,將數據流給用戶。然後,您會在您的Javascript回調函數中讀取 此鏈接,並在新的 窗口中將其打開。
  2. 使用IFRAME,如上面提到的DAN Natic。
  3. 更復雜:對二進制數據進行Base64編碼並將其作爲Json結果的一部分返回。讀取base64編碼的文件,使用Javascript對其進行解碼(大量的庫可以在網上找到),並執行結果*。

*我不確定在ZIP文件的情況下可以做任何事情。您可以使用這種技術在瀏覽器內部顯示PDF文件,但非常懷疑它可以在所有瀏覽器上使用。我的建議是與選項1一起去。

1

Ajax:窗口。location ='/ Home/download';

C#:

 public FileResult download() 
     { 
      return File("~/" + path, "application/pdf", string.Format(fileName)); 
     }