30

これが簡単な質問であることを願っています。いくつかのレポートを作成し、それをローカル マシンに保存するようユーザーに促す必要があります。前回これを行ったとき、ファイルを Web サーバーに書き込み、それをResponseオブジェクト経由でクライアントに送信しました。

ウェブサーバー上に作成する

            TextWriter tw = new StreamWriter(filePath);

クライアントに送信する

           page.Response.WriteFile(path);

問題は、物理ファイルの Web サーバーへの書き込みをスキップして、ドキュメントを表すオブジェクトから直接応答する方法はありますか?

4

4 に答える 4

28

このように Response.ContentType を使用できます

Response.ContentType = "text/plain";
Response.OutputStream.Write(buffer, 0, buffer.Length);
Response.AddHeader("Content-Disposition", "attachment;filename=yourfile.txt");

これはもちろん、テキスト ファイルを書きたい場合に機能します。たとえば、.doc を作成する場合は、ContentType を「application/msword」などに変更します。

于 2009-07-02T06:49:49.870 に答える
17

あなたはできる。

これを試して:

Table oTable = new Table();
//Add data to table.

Response.Clear();
Response.Buffer = true;
Response.ContentType = "application/vnd.ms-excel";
Response.AddHeader("Content-Disposition", "attachment;filename="test.xls"");
Response.Charset = "";
this.EnableViewState = false;
System.IO.StringWriter oStringWriter = new System.IO.StringWriter();
System.Web.UI.Html32TextWriter oHtmlTextWriter = new System.Web.UI.Html32TextWriter(oStringWriter);
0Table.RenderControl(oHtmlTextWriter);
Response.Write(oStringWriter.ToString());
Response.End();

これにより、ユーザーは test.xls ファイルを開くか保存するように求められます。同様に、Table の代わりに他の ASP.NET オブジェクトを提供できます。

于 2009-07-02T06:46:22.280 に答える
5

はい。

page.Response.WriteFile(yourData, 0, yourData.Length);
于 2009-07-02T06:46:48.050 に答える
5

質問に対する正確な答えは、レポートをどのように構成しているか (つまり、参照している「オブジェクト」は何か) によって異なります。文字列が 1 つだけの場合は、Response.Write を使用して書き込むことができます。TextWriter が必要な場合は、Response.Output が必要です。これにより、ディスクへの書き込みと WriteFile の使用をスキップできます。また、コンテンツがたまたまバイナリである場合は、そのために Response.OutputStream を使用できます。

ユーザーにファイルの保存ダイアログを表示させたい場合は、Response.AddHeader("Content-Disposition", "attachment") を設定することもできます。ただし、Content-Disposition は必ずしも受け入れられるとは限らないため、ユーザーは引き続きレポートをブラウザーで直接開くことができます。実際のコンテンツを出力する前に、必ずヘッダーを設定してください!

また、レポートの形式によっては、Response.ContentType を text/plain、text/csv などの適切なものに設定することもできます。正しい MIME タイプは、IANA サイトにリストされています。

于 2009-07-02T06:49:09.840 に答える