8

画面から出力されたテキストをテキストファイルとしてダウンロードしようとしています。以下はコードです。一部のページでは機能していますが、他のページではまったく機能していません。誰かがここで何が悪いのか提案できますか?

protected void Button18_Click(object sender, EventArgs e){
    Response.Clear();
    Response.Buffer = true;
    Response.ContentType = "text/plain";
    Response.AppendHeader("content-disposition", "attachment;filename=output.txt");

    StringBuilder sb = new StringBuilder();
    string output = "Output";
    sb.Append(output);
    sb.Append("\r\n");
    Response.Write(sb.ToString());
}
4

2 に答える 2

29

Joshuaがすでに述べたように、出力ストリーム(Response)にテキストを書き込む必要があります。また、その後、Response.End()を呼び出すことを忘れないでください。

protected void Button18_Click(object sender, EventArgs e)
{
    StringBuilder sb = new StringBuilder();
    string output = "Output";
    sb.Append(output);
    sb.Append("\r\n");

    string text = sb.ToString();

    Response.Clear();
    Response.ClearHeaders();

    Response.AppendHeader("Content-Length", text.Length.ToString());
    Response.ContentType = "text/plain";
    Response.AppendHeader("Content-Disposition", "attachment;filename=\"output.txt\"");

    Response.Write(text);
    Response.End();
}

編集1:詳細を追加

編集2:ユーザーがファイル名を引用符で囲むことを推奨している他のSO投稿を読んでいました:

Response.AppendHeader("content-disposition", "attachment;filename=\"output.txt\"");

ソース: https ://stackoverflow.com/a/12001019/558486

于 2013-02-07T16:03:17.480 に答える
4

それが実際のコードである場合、応答ストリームにテキストを書き込むことは決してないため、ブラウザーはデータを受信しません。

少なくとも、あなたは必要なはずです

Response.Write(sb.ToString());

応答にテキストデータを書き込みます。また、追加のボーナスとして、事前に長さがわかっている場合はContent-Length、ブラウザがダウンロードの進行状況を表示できるように、ヘッダーを使用して長さを指定する必要があります。

また、メソッドの一部として設定Response.Buffer = true;していますが、応答を明示的にフラッシュしてブラウザーに送信することはありません。Response.Flush()書き込みステートメントの後にを追加してみてください。

于 2013-02-07T15:56:23.203 に答える