vb.net Web アプリケーションに、一連のデータをテキスト ファイルに入れ、それをユーザーに提示してダウンロードする必要があるページがあります。このようなテキスト ファイルを .net Web サーバー上で構築するための最良/最も効率的な方法は何ですか?
編集:以下の質問に答えるために、これは一度ダウンロードしてから捨てる種類のファイルになります。
更新: John Rudy と DavidK による提案をまとめたところ、完全に機能しました。皆さんありがとう!
vb.net Web アプリケーションに、一連のデータをテキスト ファイルに入れ、それをユーザーに提示してダウンロードする必要があるページがあります。このようなテキスト ファイルを .net Web サーバー上で構築するための最良/最も効率的な方法は何ですか?
編集:以下の質問に答えるために、これは一度ダウンロードしてから捨てる種類のファイルになります。
更新: John Rudy と DavidK による提案をまとめたところ、完全に機能しました。皆さんありがとう!
StringBuilder を使用してファイルのテキストを作成し、Content-Disposition を使用してユーザーに送信します。
ここにある例: http://www.eggheadcafe.com/community/aspnet/17/76432/use-the-contentdispositi.aspx
private void Button1_Click(object sender, System.EventArgs e)
{
StringBuilder output = new StringBuilder;
//populate output with the string content
String fileName = "textfile.txt";
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
Response.WriteFile(output.ToString());
}
まったくビルドせず、HttpHandler を使用して、テキスト ファイルを出力ストリームに直接提供します。
http://digitalcolony.com/labels/HttpHandler.aspx
中途半端のコード ブロックが良い例です。独自に調整できます。
public void ProcessRequest(HttpContext context)
{
response = context.Response;
response.ContentType = "text/xml";
using (TextWriter textWriter = new StreamWriter(response.OutputStream, System.Text.Encoding.UTF8))
{
XmlTextWriter writer = new XmlTextWriter(textWriter);
writer.Formatting = Formatting.Indented;
writer.WriteStartDocument();
writer.WriteStartElement("urlset");
writer.WriteAttributeString("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
writer.WriteAttributeString("xsi:schemaLocation", "http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd");
writer.WriteAttributeString("xmlns", "http://www.sitemaps.org/schemas/sitemap/0.9");
// Add Home Page
writer.WriteStartElement("url");
writer.WriteElementString("loc", "http://example.com");
writer.WriteElementString("changefreq", "daily");
writer.WriteEndElement(); // url
// Add code Loop here for page nodes
/*
{
writer.WriteStartElement("url");
writer.WriteElementString("loc", url);
writer.WriteElementString("changefreq", "monthly");
writer.WriteEndElement(); // url
}
*/
writer.WriteEndElement(); // urlset
}
}
答えは、Forgotten Semicolon が言及しているように、繰り返しダウンロードする必要があるのか、それとも 1 回限りの使い捨てが必要なのかによって異なります。
いずれにしても、ダウンロード ウィンドウが確実に表示されるように、出力の content-type を設定することが重要です。ストレート テキスト出力の問題は、ブラウザが独自のウィンドウにデータを表示しようとすることです。
コンテンツ タイプを設定する主な方法は、テキストが出力文字列で、ファイル名がファイルを (ローカルに) 保存する既定の名前であると仮定して、次のようなものになります。
HttpResponse response = HttpContext.Current.Response;
response.Clear();
response.ContentType = "application/octet-stream";
response.Charset = "";
response.AddHeader("Content-Disposition", String.Format("attachment; filename=\"{0}\"", filename));
response.Flush();
response.Write(text);
response.End();
これにより、ユーザーのダウンロードが促されます。
ファイルを文字通り Web サーバーに保存する必要がある場合は、より複雑になりますが、それほどではありません。そこで、System.IO のクラスを使用して、テキストをテキスト ファイルに書き出す必要があります。書き込み先のパスが、Network Service、IUSR_MachineName、および ASPNET Windows ユーザーによって書き込み可能であることを確認してください。それ以外の場合は、同じ取引 -- コンテンツ タイプとヘッダーを使用して、ダウンロードを確実にします。
必要がない限り、文字通りファイルを保存しないことをお勧めします。その場合でも、サーバー上で直接保存する手法は適切ではない可能性があります。(たとえば、上記のファイルをダウンロードするためにアクセス制御が必要な場合はどうすればよいでしょうか? アプリのルートの外側でそれを行う必要があります。ホスティング環境によっては、可能な場合と不可能な場合があります。)
したがって、あなたが 1 回限りのモードなのか、それともファイルを保存しなければならないモードなのかを知らずに、またセキュリティへの影響を知らずに (サーバー側の保存が本当に必要な場合は、おそらく自分で解決する必要があります)、それは約です。私があなたに与えることができる最高のもの。
サーバー側で「ファイル」である必要はないことに注意してください。それをファイルに変換するのはクライアントです。