2009-08-26 15 views
8

in other Stack Overflow questionのような標準のASP.NETファイルダウンロード応答を使用したいと考えています。ASP.NET AJAXでのファイルダウンロードの実装方法

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

しかし、更新パネル内では機能しません。更新イベントの中でダウンロードイベントが発生した場合、ファイルを取得する必要がありますか?

+0

クライアントに提供したいファイルを指し示すURLを作成し、それをブラウザに渡してファイルをダウンロードするだけでは不思議です。 ? – 7wp

+0

これは通常はブラウザに直接表示されるtxtファイルです。コンテンツタイプが "application/octet-stream"に設定されている場合、ブラウザはディスクへのダウンロードを開始すると思います。 – awe

+0

よく「txt」ファイルは単なる例です。ブラウザには直接表示されません。この応答では、常にダウンロード可能です。 –

答えて

2

これは、ajaxを使用しない別のaspxに入れる必要があります。 Ajaxは、クライアント側のページの既存のHTMLマークアップを更新しています。ここで試してみるのは、クライアントに何かを送る前に、サーバー側の応答コンテンツを置き換えることです。

あなたはこれを試みることができる:

は、あなたが既に持っているの送信コードが含まれているDownload.aspxと呼ばれるページがあります。あなたのオリジナルのページで

、あなたがこのようなダウンロードページを呼び出すJavaScriptのコールがあります。

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

をあなたはこのwork.Itのハンドラを作ってみることができますが、うまく修正することができれば、より安全です。 この作業では、ページのファイルパスを暗号化して、ファイルのリンク先を指定する必要があります。

<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 

暗号化技術の多くは、あなたのハンドラページではhere

であり、あなたはSystem.IOライブラリとそれを読むことができるように、元の1にファイルパスを解読する必要があります。

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

あなたのMIMEタイプは、画像などの静的でない限り、あなたは、レジストリがあなたのMIMEタイプを指定することができます。

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(); 

幸運。

0

ノー__EVENTTARGETで__doPostBackを呼び出すJavaScript関数を呼び出すことによってこの問題を解決することができました。

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

サーバー側のグリッドは、__EVENTARGUMENTを解析し、エクスポートファイルをレンダリングします。

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

私は最初にイベントIDとしてグリッドIDを渡そうとしましたが、doPostBackはそれがajaxパネル内のコントロールであり、makeとajaxのポストバックを知っています。 –

関連する問題