2009-03-06 6 views
3

私の問題:ユーザーがaspxページの画像ボタンをクリックするとコードビハインドがzipファイルを作成し、そのzipファイルをユーザーにストリーミングしようとします。asp.netの画像ボタンをクリックしてzipファイルをストリーミングする方法はありますか?

Sys.WebForms.PageRequestManagerParserErrorException:私はページ上の次のエラーを取得しています、これを実行しようとすると

FileInfo toDownload = new FileInfo(fullFileName); 
if (toDownload.Exists) 
{ 
    Response.Clear(); 
    Response.ContentType = "application/zip"; 
    Response.AppendHeader("Content-Disposition", "attachment;filename=" + 
      toDownload.Name); 
    Response.AppendHeader("Content-Length", toDownload.Length.ToString()); 
    Response.TransmitFile(fullFileName); 
    HttpContext.Current.ApplicationInstance.CompleteRequest(); 
} 

:私は、次のコードを使用していたファイルをストリームに

:サーバーから受信したメッセージを解析できませんでした。このエラーの一般的な原因は、Response.Write()、レスポンスフィルタ、HttpModules、またはサーバートレースの呼び出しによって応答が変更された場合です。 詳細: 'PK ...'の近くでエラーを解析しています。

PKはzipファイルの最初の2文字で、zipファイルとして識別されるため、zipファイルをブラウザに送信しようとしていることがわかります。しかし、私はダウンロードファイルオプションをポップアップしたいのですが、ブラウザがzipファイルを解釈したりレンダリングしようとしているという印象を受けます。

アイデア?

EDIT:たとえばHere's a link to a post from the guy who wrote the above error message.

+0

この前に実行されますどのようなコード:

ソリューションは、制御のためのPostBackTriggerを作成することでしたか?これは一般に、ブラウザのヘッダーを送信したために発生します。 –

答えて

2

が、ここで私は(あなたが不足している変数宣言の一部を変更/で記入する必要があります)私のアプリケーションの一つに、クライアントにPDFを送信する方法は次のとおりです。

 byte[] rendered = uxReportViewer.LocalReport.Render("PDF", null, out mimeType, out encoding, out extension, out streamIds, out warnings); 

     Response.Buffer = true; 
     Response.Clear(); 
     Response.ClearHeaders(); 
     Response.ContentType = mimeType; 
     Response.CacheControl = "public"; 
     Response.AddHeader("Pragma", "public"); 
     Response.AddHeader("Expires", "0"); 
     Response.AddHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0"); 
     Response.AddHeader("Content-Description", "Report Export"); 
     Response.AddHeader("Content-Disposition", "attachment; filename=\"" + filename + "." + extension + "\""); 

     Response.BinaryWrite(rendered); 
     Response.Flush(); 
     Response.End(); 

コンテンツの種類を変更し、ZIPファイルをバイト配列に変換して、残りの部分を埋め込むことができると思います。

+0

larsonicのアイデアをありがとう - 私はそれを試みましたが、残念ながらそれは問題を解決しません。私が言及したように、私はそれがブラウザに何かだと思う... – Guy

0

ガイ、zipファイルを生成するためにDotNetZipを使用していませんか? zipファイルをディスク上に作成せずにメモリ内にのみ作成した場合はどうなりますか?この例ではDotNetZipを使用しています。

Response.Clear(); 
    Response.BufferOutput = false; 
    String ReadmeText= "This is content that will appear in a file " + 
         "called Readme.txt.\n" + 
         System.DateTime.Now.ToString("G") ; 
    string archiveName= String.Format("archive-{0}.zip", 
             DateTime.Now.ToString("yyyy-MMM-dd-HHmmss")); 
    Response.ContentType = "application/zip"; 
    Response.AddHeader("content-disposition", "attachment; filename=" + archiveName); 

    using (ZipFile zip = new ZipFile()) 
    { 
     // add an entry from a string: 
     zip.AddEntry("Readme.txt", "", ReadmeText); 
     zip.AddFiles(filesToInclude, "files"); 
     zip.Save(Response.OutputStream); 
    } 
    // Response.End(); // no - see http://stackoverflow.com/questions/1087777 
    HttpContext.Current.ApplicationInstance.CompleteRequest(); 
+0

Cheeso - 私は別のスレッドであなたの推薦ごとにDotNetZipを使用していますが、私はこれが問題だとは思わない。私はそれがブラウザ上で起こっていると思う。 – Guy

1

私は最終的に問題を解決しても、おそらく私が質問に十分な情報を与えていないことに気づい:イメージボタンは、UpdatePanelの内部にあります。

<Triggers> 
    <asp:PostBackTrigger ControlID="ibDownload" /> 
</Triggers> 
関連する問題