2013-09-25 2 views
1

나는 인해 파일ASP .NET에서 파일을 쓰는 중 오류를 처리하는 방법은 무엇입니까?

모든 코드가 try/catch 예외 블록

실제로 파일을 작성하는 Response.TransmitFile를 사용하고, 실패시에 둘러싸여를 전송하도록되어있는 페이지를 (이 클라이언트에 대한 응답 문제는 클라이언트에게 자동으로 생성 된 html입니다. 한 부분이 "현재 웹 요청을 실행하는 동안 처리되지 않은 예외가 생성되었습니다."라는 오류가 자세히 설명되어 있습니다.

왜 처리되지 않은 예외가 발생합니까?

파일이 성공적으로 처리 되었다면 헤더가 text/html로 변경 되었기 때문에 오류가 발생했습니다. 그러나 TransmitFile에 대한 호출이 응답에 자체 콘텐츠를 작성한 다음 플러시하는 것처럼 보이기 때문에 실제로 바람직하지 않습니다.

어떻게해야합니까?

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(); 
} 
+0

** file.FullName **의 값이 무엇 ? – Win

+0

파일에 대한 Windows UNC 경로 (예 : \\ server \ folder \ file.ext)입니다. – Trant

+0

Response.TransmitFile 아래에 다른 코드가 있습니까? 또한 헤더와 전송 파일을 추가하기 전에 응답을 지우지 않는 이유는 무엇입니까? –

답변

1

Response.TransmitFile이 버퍼링하지 않고 응답 스트림에 파일을 직접 기록합니다.

이미 클라이언트에 쓰여져 보내 졌으므로 catch 블록의 헤더 등을 다시 가져올 수 없습니다. 일부 응답은 이미 클라이언트로 전송되었습니다!

대신 Response.Buffer 속성 또는 Response.BufferOutput이 true로 설정된 경우 파일을 메모리로 버퍼링하는 Response.WriteFile을 사용할 수 있습니다. 이것은 예외의 경우에 "되돌릴 수 있습니다".

매우 큰 파일의 경우 성능에 영향을 줄 수 있으므로 시나리오에 가장 적합한 방법을 선택하십시오.

http://msdn.microsoft.com/en-us/library/system.web.httpresponse.buffer.aspx

http://msdn.microsoft.com/en-us/library/system.web.httpresponse.writefile.aspx

http://msdn.microsoft.com/en-us/library/12s31dhy.aspx

+0

답장을 보내 주셔서 감사합니다. – Trant

+0

걱정할 필요가 없습니다. 테스트를 대신 할 수는 없지만 파일을 전송하기 전에 파일의 첫 번째 바이트를 읽거나 읽는 방식이 WriteFile 메서드보다 우수 할 것으로 예상됩니다. 일반적으로 큰 파일의 경우 TransmitFile을 선호합니다. – mikey

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); 


} 

내가 그것을 의도 한대로 그것은 지금 작동 ... 그것은 모든 바이트를 읽을하지 않는 경우 내가 그것을 액세스 거부 오류가 가정 내 catch 블록에 가서 좀 미리 생성되지, 원하는 쓰기 과정 유적 IIS html로 ...

(이 AJAX를 요청이기 때문에 내가 jQuery를 PostMessage를 응답으로 응답 필요)

관련 문제