2013-01-09 13 views
5

Desidero che il client scarichi un file memorizzato nel mio db quando si fa clic su un pulsante. Invio questa richiesta Ajax e la prendo dal lato server.Richiesta di download di file Ajax di Extjs 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!'); 
     }, 
    }); 
}, 

quindi soddisfare la richiesta con questo blocco di codice.

C#:

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

Quando ho controllato di rete con Firebug, sembra che la mia richiesta ritorna con successo con questi parametri.

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=?= 

Anche se restituito correttamente, il download non viene avviato. Ho letto un sacco di domande e articoli, ma la maggior parte delle risposte dice che l'aggiunta dell'intestazione di download forzato risolve il problema. Quale punto mi manca? Grazie.

+1

Cosa stai chiedendo qui? Non è chiaro. – Liam

+0

Il download non inizia dal lato server? Non sono riuscito a farlo partire. Il campo di risposta in Firebug sembra riempito con alcuni dati ma non c'è download. – tkcn

risposta

2

Per gestire un download è necessario utilizzare uno dei aiutante fornito

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

La maggior parte delle volte sto usando il selfest System.Web.MVC.FileStreamResult. Usalo come

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

AggiornamentoSolo alcuni Infos base alla tua modifica

Non si può avviare il download tramite richiesta XHR. Ma ci sono almeno due modi come è possibile farlo:

  • Se il file-percorso è fix e tu lo sai impostato top.location.href = "YourPath"; all'interno del gestore di successo della chiamata AJAX. [Informazioni su top.location.href]
  • Se si crea il file al volo e si desidera restituirlo, è necessario creare un iframe nascosto e iniettare un modulo in esso che quindi eseguire la richiesta.
+2

+1. Uso 'return File (foto," image/jpg ");' dove foto è un byte [] dal database. – A1rPun

+0

@ tkcn Ho aggiunto alcune informazioni aggiuntive su Filedownloads riguardanti le chiamate AJAX al mio post. Potrebbero interessarti. – sra

+0

grazie, ho già usato location.href. ma è bene imparare l'opzione iframe. Grazie.btw se hai downvoted, vergogna su di te. ma se non l'hai fatto, vergognimi: D – tkcn

1

Dopo una ricerca, ho trovato che location.href fa la stessa cosa e apre una finestra di dialogo di download. Le stesse intestazioni dovrebbero essere aggiunte alla risposta proveniente dal server. Tuttavia, non so ancora perché l'altro approccio non funzioni.

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

questo ha risolto il mio problema.

+0

è possibile passare parametri come questo. – tkcn