2013-01-09 11 views
5

Chcę, aby klient kliknął przycisk, aby pobrać plik przechowywany w mojej bazie danych. Wysyłam tę prośbę o ajax i biorę ją od strony serwera.żądanie pobrania pliku Ajax żądania C# MVC

ExtJS:

downloadFile: function (a, b, c) { 
    var feed_id =this.getMyfeedwindow().down('form').getComponent('FeedId').text; 
    Ext.Ajax.request({ 
     url: '/Feed/Download', 
     method: 'GET', 
     params: { 
      fileID: feed_id, //this.form.getComponent('file').value, 
     }, 
     failure: function (response) { 
      alert('failed !'); 
     }, 
     success: function (response) { 
      alert('success!'); 
     }, 
    }); 
}, 

następnie spełniają żądania z tego bloku kodu.

C#:

public void Download(string fileID){ 
    Response.ContentType = "application/force-download"; 
    Response.AddHeader("Content-Disposition", "attachment; Filename=\"Logo1.jpg\""); 
    Response.BinaryWrite(data); 
    Response.End(); 
} 

Po sprawdzeniu sieć z Firebug, wydaje się moja prośba zwraca powodzeniem z tych parametrów.

Cache-Control private 
Content-Disposition attachment; filename="Logo1.jpg" 
Content-Type application/force-download 
Date Wed, 09 Jan 2013 12:51:54 GMT 
Server Microsoft-IIS/8.0 
Transfer-Encoding chunked 
X-AspNet-Version 4.0.30319 
X-AspNetMvc-Version 4.0 
X-Powered-By ASP.NET 
X-SourceFiles =?UTF-8?B?RTpcVXRrdUNhblxQcm9qZWN0c1xURlNcQlRPTVxCVE9NXEZlZWRcRG93bmxvYWQ=?= 

Mimo pomyślnego powrotu pobieranie nie rozpoczyna się. Czytałem wiele pytań i artykułów, ale większość odpowiedzi mówi, że dodanie nagłówka force-download rozwiązuje problem. W którym punkcie mi brakuje? Dzięki.

+1

O co właściwie pytasz? To nie jest jasne. – Liam

+0

Pobieranie nie rozpoczyna się po stronie serwera? Nie mogłem go uruchomić. Pole odpowiedzi w Firebug wydaje się być wypełnione pewnymi danymi, ale nie ma pobierania. – tkcn

Odpowiedz

2

obsłużyć Pobierz należy użyć jednego z dostarczonych pomocnika

  • System.Web.MVC.FilePathResult
  • System.Web.MVC.FileStreamResult
  • System.Web.MVC.FileContentResult

Większość czasu używam samouczenia System.Web.MVC.FileStreamResult. Używaj go jak

FileStreamResult result = new FileStreamResult(stream, contentType); 
result.FileDownloadName = filename; // name of the downloaded file 

Aktualizacjitylko niektóre Infos oparciu o edycję

Nie możesz rozpocząć pobieranie za pomocą żądania XHR. Ale istnieją co najmniej dwa sposoby, w jaki sposób można to zrobić:

  • Jeśli plik-path to naprawić i wiesz, że ustawiony top.location.href = "YourPath"; ramach obsługi sukcesu wywołania AJAX. [Informacje o top.location.href]
  • Jeśli utworzysz plik w locie i chcesz go zwrócić należy utworzyć ukryte iframe i wstrzyknąć do niego postać, która następnie wykonać żądania.
+2

+1. Używam 'return File (photo," image/jpg ");' where photo to bajt [] z bazy danych. – A1rPun

+0

@tkcn Dodałem kilka dodatkowych informacji o filedownloads dotyczących wywołań AJAX do mojego posta. Mogą cię zainteresować. – sra

+0

dziękuję, już użyłem location.href. ale dobrze jest nauczyć się opcji iframe. dzięki.btw, jeśli zarzuciłeś, wstydź się. ale jeśli nie zrobiłeś tego, wstyd mi: D – tkcn

1

Po pewnym wyszukiwaniu okazało się, że location.href robi to samo i otwiera okno dialogowe pobierania. Do odpowiedzi z serwera należy dodać te same nagłówki. Jednak nadal nie wiem, dlaczego inne podejście nie działa.

var feed_id = this.getMyfeedwindow().down('form').getComponent('FeedId').text; 
location.href = '/Feed/Download?fileID=' + feed_id; 

to rozwiązało mój problem.

+0

możliwe jest przekazanie takich parametrów. – tkcn

Powiązane problemy