生成しますストリーミング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ではない/オクテット、処理:インラインではない、別のコンテンツエンコーディングと文字セットなど)を試してみましたが、
誰かがこの問題に直面する前に、遠くに正しい方向に似ているものをあいまいに近づけることができますか?
私が見ることができるサンプルの破損したPDFファイルがありますか? – iPDFdev
"明らかに、Adobe Readerは、保存時にバイナリオブジェクトにファイルの名前を埋め込んでいます"これは真実ではありません...まず、Adobe Readerは一般的にPDFファイルを生成しません。私はあなたの問題を解決したかどうかはわかりませんが、99.9999%が原因ではないと確信しています。 – yms
ええと、これは、コンテンツ処理で送信された元のファイル名を持つ場合にのみ開きますか?それは何かに対して妥当性を確認する必要があります。 - PDFを作成したアプリケーションに埋め込まれていたが、ファイルシステム内でファイルの名前が変更された場合、これを維持する必要があることが分かった。ファイルシステムが再埋め込みされるとは想像もできない正確なファイル名を送るときにのみ動作するのであれば、このファイル名はマッチを認識するためにバイナリオブジェクトのどこかに埋め込まなければなりませんか? –