0

何らかの理由で、[名前を付けて保存]ダイアログを表示すると、チェックサムボックスが更新されません。ただし、以下のContent-Dispositionヘッダーコードをコメントアウトすると、すべて正常に機能します。何か案は?

protected void SubmitButton_Click(object sender, EventArgs e)
{
    checksumField.Text = String.Empty;

    FileInfo filename = this.CreateFileInfoFromInput();

    if (!filename.Exists)
    {
        tableField.Focus();
        tableField.BorderColor = System.Drawing.Color.Red;
        return;
    }

    this.SaveFile(filename);
    checksumField.Text = GetChecksum(filename);
}

private FileInfo CreateFileInfoFromInput()
{
    /* blah */
    return new FileInfo(blah);
}

private string GetChecksum(FileInfo filename)
{
    return "test";
}

private void SaveFile(FileInfo fileName)
{
    // Clear old headers
    Response.Clear();
    Response.Buffer = false;

    // Set the ContentType and Headers
    Response.ContentType = "application/octet-stream";
    Response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName.Name);  //  <<<---- FAILING RIGHT HERE
    Response.AppendHeader("Content-Length", fileName.Length.ToString(System.Globalization.CultureInfo.InvariantCulture));
    Response.AppendHeader("Connection", "Keep-Alive"); 

    // Send data
    Response.TransmitFile(fileName.FullName);
}
4

1 に答える 1

1

ページのライフサイクルを短絡しています。

ページ自体を更新して応答ストリームにレンダリングする代わりに、応答にファイルを挿入します

私のアドバイスは、次の手順に従うことです。

  1. 単純なハンドラー(IDに基づいてファイルをサーバー化するashxファイル)を作成します
  2. このハンドラー(またはこのURLを開くスクリプト)へのリンクを生成するようにページを変更します

ユーザーがIDを送信したら、実行したとおりにファイルを生成し(プロセスが短いことを期待します)、テキストボックスを更新し(これは実行したとおりに機能するはずです)、ハンドラーファイルサービスへのリンクを追加します。

セキュリティへの影響に注意してください。URLで指定されたファイルをやみくもに送信しないでください(ファイルパスの挿入を避けるため)。

于 2012-07-24T14:05:52.327 に答える