2009-08-26 3 views
8

Vorrei utilizzare la risposta di download del file ASP.NET standard, come in other Stack Overflow question.Come implementare un download di file in ASP.NET AJAX

Response.ContentType = "application/octet-stream"; 
Response.AppendHeader("Content-Disposition","attachment; filename=logfile.txt"); 
Response.TransmitFile(Server.MapPath("~/logfile.txt")); 
Response.End(); 

Ma all'interno del pannello di aggiornamento non funziona. Cosa devo fare, che otterrò un file se l'evento di download viene attivato all'interno del pannello di aggiornamento?

+0

Sono curioso di sapere perché non si costruisca solo un URL che punta al file che si desidera offrire al client e lo si dia al browser da utilizzare per scaricare il file. ? – 7wp

+0

È un file txt, che normalmente verrebbe mostrato direttamente nel browser. Se il tipo di contenuto è impostato su "application/octet-stream", suppongo che il browser avvii invece un download su disco. – awe

+0

Il file "txt" è solo un esempio. E non viene visualizzato direttamente nel browser. Con questa risposta è sempre scaricabile. –

risposta

2

È necessario avere questo in un aspx separato che non utilizza Ajax. Ajax sta aggiornando il markup html esistente su una pagina sul lato client. Quello che provi qui è sostituire il contenuto di responce sul lato server prima di inviare qualcosa al client.

Si potrebbe provare questo:

Avere una pagina chiamata Download.aspx che contiene il codice di trasmissione che già avete.

Nella pagina originale, una chiamata javascript che chiama la pagina di download in questo modo:

window.location.replace('Download.aspx'); 
0

Si può provare a fare un gestore per questo work.It è più sicuro se è possibile modificare bene. Per questo lavoro, è necessario crittografare il percorso del file nella pagina in cui si inserisce un collegamento per il file.

<a href=\"Downloads.ashx?f={0}\" target=\"_blank\">Your link to file</a> 
//{0} -> Encrypted file path 
//target = _blank force browser to download file in another window 

Ci sono un sacco di tecniche di crittografia a here

Nella tua Handler pagina, è necessario per decifrare il percorso del file in un unico originale modo da poter leggere con System.IO librerie.

context.Response.ContentType = ""; //-->MimeType for your file's extension 

è possibile specificare il MimeType dal Registro di sistema a meno che il mime-type è statico come immagini.

string mimeType = Registry.GetValue(string.Format(@"HKEY_CLASSES_ROOT\.{0}", 
        Path.GetExtension(decryptedfilePath)), "Content Type", null).ToString(); 

//Then everything is ready for download 

byte[] buffer = File.ReadAllBytes(decryptedfilePath); 
context.Response.OutputStream.Write(buffer, 0 , buffer.Length); 
context.Response.Flush(); 

Buona fortuna.

0

sono stato in grado di risolvere questo chiamando una funzione JavaScript, che chiama __doPostBack senza __EVENTTARGET.

function GxGridView_Export(exportLink, exportType) { 
    var containingGrid = $(exportLink).closest("table .GxGridViewWithSlider"); 
    __doPostBack('', containingGrid.attr('id') + "###" + exportType); 
} 

Il server lato Griglia quindi analizza __EVENTARGUMENT e esegue il rendering del file di esportazione.

var eventArg = Page.Request.Form["__EVENTARGUMENT"]; 
if (!string.IsNullOrEmpty(eventArg) && eventArg.Contains("###")) 
{ 
    var eventParams = eventArg.Split(new string[] { "###" }, StringSplitOptions.RemoveEmptyEntries); 
    if (eventParams.Length == 2 && eventParams[0] == this.ClientID) 
    { 
     ExportGrid(eventParams[1]); 
     return; 
    } 
} 
+0

Inizialmente ho provato a passare l'id della griglia come destinazione dell'evento, ma doPostBack era abbastanza intelligente da sapere che si tratta di un controllo all'interno di un pannello Ajax, e invece di effettuare e postback su Ajax. –