1

ファイルを送信することになっているページがあります

すべてのコードは、try / catch Exception ブロックで囲まれています

私は Response.TransmitFile を使用して実際にファイルを書き込みますが、失敗した場合 (私の場合は権限の問題が原因で)、クライアントへの応答は、エラーの詳細を示す自動生成された html であり、一部は次のように述べています:「ハンドルされていない例外が生成されました現在の Web リクエストの実行中です。」

未処理の例外と表示されるのはなぜですか?

ファイルが正常に処理された場合に設定されていたはずのオクテット ストリームではなく、ヘッダーが text/html に変更されたため、エラーが発生しました。しかし、TransmitFile の呼び出しは、独自のコンテンツを Response に書き込み、それをフラッシュするように見えますが、これは本当に望ましくありません!

私に何ができる?

try
{
    String targetFile = Request.Form["filePath"];
    if (targetFile == null) throw new Exception("No filename provided");
    FileInfo file = new FileInfo(targetFile); 
    if (!file.Exists)
    {
        // file not found error
        throw new Exception("File not found");
    }

        Response.ContentType = "APPLICATION/OCTET-STREAM";
        Response.AppendHeader("Content-Disposition", "Attachment; Filename=\"" + Path.GetFileName(targetFile) + "\"");

        Response.TransmitFile(file.FullName);

} 
catch (Exception e) 
{
    Response.ClearHeaders();
    Response.ClearContent();
    Response.ContentType = "text/html";

    StringBuilder sb = new StringBuilder();
    // I write my own response in sb - I never see this content sent back!!
    Response.Write(sb.ToString());
    Response.Flush();
}
4

2 に答える 2

1

これが私がそれを再び機能させるためにしたことです。そんなハックのように思えますが...うーん!

using (FileStream stream = file.OpenRead())
{

byte[] buffer = new byte[1];
int read = stream.Read(buffer, 0, buffer.Length);

if (read <= 0)
{
    throw new Exception("Access denied");
}

Response.ContentType = "APPLICATION/OCTET-STREAM";
Response.AppendHeader("Content-Disposition", "Attachment; Filename=\"" + Path.GetFileName(targetFile) + "\"");

Response.TransmitFile(file.FullName);


}  

意図したとおりに機能するようになりました...バイトが読み取られない場合は、アクセス拒否エラーであると想定し、キャッチブロックに移動して、プロセスを台無しにする事前生成された IIS html ではなく、必要なものを書き込みます。 ..

(これは AJAX 要求であるため、jQuery の postMessage 応答で応答する必要があります)

于 2013-09-25T18:57:49.787 に答える