2012-05-11 1 views
0

생성스트리밍 PDF 파일을 다운로드 할 파일을 제공하는 제네릭 처리기를 Adobe Reader가 손상 오류

Dim request As HttpRequest = context.Request 
    Dim response As HttpResponse = context.Response 
    response.ContentType = "application/octet-stream" 
    response.AddHeader("content-disposition", "inline; filename=" & filename) 
    response.Buffer = True 
    response.OutputStream.Write(fileBytes, 0, fileBytes.Length) 
    response.Flush() 
    response.Close() 

('fileBites은'내 바이트 배열, '파일 이름은'내 파일 이름입니다).

fileBites가 .txt 파일 인 경우 다운로드가 시작되고 파일을 완벽하게 읽습니다.

그러나 .pdf 및 .docx 파일이 손상되었음을 발견했습니다. - .docx의 경우 Word에서 파일을 복구해야하고 그렇게 할 수있는 권한이 있는지 묻습니다. 이 권한을 부여하면 즉시 수정되어 완벽하게 표시됩니다.

분명히 나는 ​​사용자가이 손상 대화를보고 잠시 동안 조사한 후에 이것을 발견했다 : http://forums.asp.net/t/1301978.aspx/1/10 - 부패의 이유가 하나의 여분의 비어있는 비트라는 것이 바이트 끝에 기록되었다 배열 : 나는 하나의 비트에 의해 길이를 놓아 확인 :

response.OutputStream.Write (fileBytes, 0 fileBytes.Length을 - 1)

과 마법 같은 .DOCX 다운로드 지금 작동! (현재의 문제는 아니며 문맥에 포함 시키거나 다른 사람이 같은 문제가있는 경우)

.docx 파일은 이제 올바르게 스트리밍되지만 .pdf 파일은 그렇지 않습니다. 그들은 (정확한 KB 크기로) 한 조각에 전송하는 것 그러나 나는 시도하고 다운로드 한 파일을 열 때 어도비 리더 X는 저에게 말한다 : 2008 년 어도비 포럼에 상당히 오랫동안 해결되지 않은 논의가 있었다

Adobe Reader could not open xxxx because it is either not a supported file type 
or because the file has been damaged (for example, it was sent as an email 
attachment and wasn't correctly decoded). 

( http://forums.adobe.com/thread/391712).이 문제는이 정확한 문제를 해결하지만 현재는 해결되지 않았습니다. 사용자가 게시 한 모든 대안 (콘텐츠 형식 :/pdf가 아닌/옥텟, 처리 : 인라인이 아닌 응용 프로그램, 다른 콘텐츠 인코딩 및 문자 집합 등)을 시도했지만 아무 소용이 없습니다.

누구든지이 문제가 발생하기 전에 내가 어딘가에 막연하게도 옳은 방향과 원격으로 유사한 것을 대략적으로 가리킬 수 있는지 궁금합니다.

+2

내가 볼 수있는 샘플 손상된 PDF 파일이 있습니까? – iPDFdev

+0

"분명히 Adobe Reader는 저장시 이진 객체에 파일 이름을 임베드했습니다."이 사실이 아닙니다 ... 처음에는 일반적으로 Adobe Reader가 PDF 파일을 생성하지 않습니다. 나는 당신의 문제를 해결 한 것이 무엇인지 모르지만, 99.9999 %가 이것이 원인이 아니라는 것을 확신합니다. – yms

+0

흠, 콘텐츠 처리시 보낸 원래 파일 이름이있는 경우에만 열립니다. 그것은 무언가에 대해 유효성을 검증해야합니다. - PDF를 만든 응용 프로그램에 포함되어 있다고했지만 파일 시스템 내에서 파일 이름이 바뀌면 유지해야 할 필요가 있음을 깨달았습니다. 파일 시스템이 다시 포함될 것이라고 상상할 수 없습니다. 자신의 경로지만, de-constructive pov에서 정확한 파일 이름을 보낼 때만 작동한다면이 파일 이름은 일치를 인식하기 위해 바이너리 객체의 어딘가에 삽입되어야합니다. –

답변

0
(주석 및 편집에 대답 Question with no answers, but issue solved in the comments (or extended in chat)를 참조하십시오.)

영업 쓴

:

시간 동안 그것을 바라 데이 대답이 질문 게시 직후에 출연 - 자주 그렇다 방법! 어쨌든 여기에 내 특정 문제가 붙어있는 다른 사람을위한 해결책은 다음과 같습니다.

파일을 데이터베이스에 추가 할 때 이름을 바꿀 수도있었습니다. 파일을 선택하고 이름을 지정하고 [Fileblob],[Filename]으로 DB에 저장합니다. 더 이상 파일 시스템의 특정 위치에 연결되지 않았기 때문에 임의의 이름을 선택할 수 있습니다. - 잘못된! - .txt 및 .docx 파일을 사용하면 원래 이름이 호출되지 않았습니다.

분명히 파일이 저장 될 때 이진 객체에 파일 이름이 임베드되어 있으며 문서가 열릴 때 문서에 포함 된 이름에 대해 content-disposition에 제공된 이름을 확인합니다. 그런 다음 일치하지 않으면 손상 오류가 발생합니다.

지금, 나는 [Fileblob],[Filename],[originalFilename]로 데이터베이스에서 파일을 저장하고 그것을 열 때 내가 사용하고 있습니다 :

response.AddHeader("content-disposition", "inline;filename=" & originalFilename) 

가 그것을 이해 이름을 지정 ..to. 필자는 더 이상 필요 없지만 해결 방법으로 데이터베이스에서 PDF를 저장할 때 원래 이름을 PDF에서 제거하는 것이 더 멋지다고 생각합니다.