web-dev-qa-db-ja.com

C#Asp.netクライアントへのファイルの書き込み

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

ウェブサーバーで作成する

            TextWriter tw = new StreamWriter(filePath);

クライアントに送信する

           page.Response.WriteFile(path);

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

27
jim

次のように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」などに変更します。

28

あなたはできる。

これを試して:

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オブジェクトを提供できます。

17
Ganesh R.

はい。

page.Response.WriteFile(yourData, 0, yourData.Length);
5

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

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

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

5
Jouni Heikniemi