2012-05-11 6 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 - これは、破損の理由が余分な空きビット1つであることを示唆しました配列:

response.OutputStream.Write(fileBytes、0、fileBytes.Length - 1)

と魔法のように、.docxのダウンロード今すぐ仕事:私は1ビット長をドロップすることで確認!

現在、.docxファイルは正しくストリーミングされていますが、.pdfファイルは正しくありません。 (

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

2008日付アドビのフォーラムでかなり長い未解決の議論がありました:彼らは(正しいKBのサイズで)一体に転送するように見えるが、私は試してみて、ダウンロードしたファイルはAdobe Reader Xが私に語っを開いたときhttp://forums.adobe.com/thread/391712)がこの問題に対処していますが、これは現在死んでいます。私はユーザーが投稿したすべての回避策(コンテンツタイプ:/ pdfではない/オクテット、処理:インラインではない、別のコンテンツエンコーディングと文字セットなど)を試してみましたが、

誰かがこの問題に直面する前に、遠くに正しい方向に似ているものをあいまいに近づけることができますか?

+2

私が見ることができるサンプルの破損したPDFファイルがありますか? – iPDFdev

+0

"明らかに、Adobe Readerは、保存時にバイナリオブジェクトにファイルの名前を埋め込んでいます"これは真実ではありません...まず、Adobe Readerは一般的にPDFファイルを生成しません。私はあなたの問題を解決したかどうかはわかりませんが、99.9999%が原因ではないと確信しています。 – yms

+0

ええと、これは、コンテンツ処理で送信された元のファイル名を持つ場合にのみ開きますか?それは何かに対して妥当性を確認する必要があります。 - PDFを作成したアプリケーションに埋め込まれていたが、ファイルシステム内でファイルの名前が変更された場合、これを維持する必要があることが分かった。ファイルシステムが再埋め込みされるとは想像もできない正確なファイル名を送るときにのみ動作するのであれば、このファイル名はマッチを認識するためにバイナリオブジェクトのどこかに埋め込まなければなりませんか? –

答えて

0
(コメントや編集中に回答 Question with no answers, but issue solved in the comments (or extended in chat)を参照してください。)

ザ・OPが書いた

は時間のためにそれを見つめていたが、答えはこの質問投稿後まもなく登場 - しばしばそうです方法!いずれにせよ、ここに私の特定の問題にこだわって他の誰のための解像度は次のとおりです。私は、データベースにファイルを追加する場合

、私はまた、名前を変更することができました。私はファイルを選択し、名前をつけてDBに格納します。[Fileblob],[Filename] - ファイルシステム内の特定の場所にもはや結びついていないので、任意の名前を選ぶことができました。 - 違う! - .txtファイルと.docxファイルでは、これは問題なく、元の名前は呼び出されませんでした。

明らかに、ファイルの名前が保存されたときにファイルの名前が埋め込まれていて、ファイルが開かれたときにドキュメントに埋め込まれた名前に対してcontent-dispositionで指定された名前がチェックされます。一致しない場合、破損エラーがスローされます。

今、私は[Fileblob],[Filename],[originalFilename]としてデータベースにファイルを格納していますし、それを開いたとき、私は使用しています:

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

はそれにそれが理解名前を付け..to。私はよりエレガントな方法は、もはや必要ではなく、これはちょうどうまく動作する回避策として、データベースに格納するときにPDFから元の名前を取り除くことだろうと思います。

関連する問題