2

NodeJSを使用して構築しているWebサイトがあり、(他のファイルの中でも)いくつかのPDFを提供する必要があります。

理由は特定できませんが、Internet Explorer 8 は、Acrobat Viewer で PDF を完全にダウンロードできません (初回は何度も)。ファイルを直接保存しても問題ありませんが、これは理想的ではありません。他のブラウザはテストしていませんが、Chrome は問題なく動作します。

ステータス バーの更新が停止し、次のように表示される以外に、エラー メッセージはありません: (ソース: twimg.com )ダウンロード済み (16.33 MB 中 2.97 MB):

NodeJS と Express (v3、beta2) / Connect フレームワーク (ファイルを提供しているのは Connect Static ミドルウェア) を介してファイルを提供しています。SSL 経由でも提供していますが、これをオフにしてもヘルプ。

どんなアイデアでも大歓迎です!ありがとう

編集- 詳細を含めるには:

まず、Express v2 から v3 にアップグレードして問題を解決しようとしましたが、そのような運はありません。

これは、ファイルを提供するアプリ ルートです。静的サービング コンポーネントは機能するため、問題は IE がファイルを取得する方法または Express が IE にファイルを提供する方法のどこかにあるようです。

app.get('/store/*', ensureAuthenticated, express.static(__dirname + '/../uploads'));

function ensureAuthenticated(req, res, next) {
    if (req.isAuthenticated()) {    
        return next();
    }
} else {
    res.redirect('/login');
}

エラーに関しては、404 エラーも IE にも何も表示されません。空白の画面でハングアップし、左下のステータスバーにダウンロードされた量を示す上の画像が表示されます. Adobe は最終的に (~5 分後)、「このファイルは破損しているため、修復できません」という警告で失敗します。時々 IEファイルをロードするので、ファイルが破損していないことはわかっています (以下の Fiddler リクエストを参照してください)。

Fiddler では、次のように表示されます。 PDF に対する IE からの複数の要求。 2回失敗、1回成功

最初の 2 つの要求は失敗しましたが、3 番目の要求は PDF の配信に成功しました。

他に提供できることがあれば、お知らせください。

4

1 に答える 1

5

それで、私は問題を見つけました(または少なくとも解決策または4)。

しばらく時間がかかり、膨大な量の調査、テスト ケース、およびあらゆる種類の作業が必要でしたが、最終的にはそこにたどり着きました。

IE8 (およびおそらく他のブラウザーも同様ですが、私は十分にテストしていません) が Adob​​e 9 (Adobe X または他のバージョンでは検証されていません) プラグインを使用して PDF を要求すると、ファイル全体が 1 つとして取得されることがあります。これは私が見た成功であり、上記の Fiddler スクリーンショットのリクエスト 22 に対応しています。ファイルが小さい場合はファイル全体を取得するようですが、この場合は 16MB の PDF でテストしていました。

それ以外の場合、アドビは次の形式の範囲ヘッダーを送信します。

Range: bytes=a-b, c-d

ab は範囲、cd は連続していないように見える範囲です。

Range ヘッダーに関する私の知識はそれほど広範囲ではないため、これが有効かどうかはわかりません。私が行った調査では、そうではないことが示唆されています。

とにかく、Connect の static.js では、lib/util.js で parseRange と呼ばれる範囲解析メソッドを使用します。このメソッドは、次の形式で範囲の配列を返します。

[
   { start: a, end: b },
   { start: c, end: d}
]

static.js では、このメソッドを呼び出して値をrangeに割り当て、次にrange[0]を使用して範囲を計算し、値cdを無視します。abの間の範囲は、ファイルから読み取られ、要求に送信される唯一のデータです。

Adobe 9 はさらにデータを待ち続けていると思います。

ソリューション

  • 最も簡単な解決策は、static.js のヘッダー「Accept-Ranges」を削除することです。
  • 私が実装したより複雑な (そして必ずしも正しいとは限らない) 解決策は、acの最小値とbdの最大値を取得して新しい範囲を作成し、それを範囲チェック コードで返すことです。この要点は、私が行ったことを示しています: https://gist.github.com/2930131
  • 私が信じている3番目の(可能な)解決策は、クライアントがデータを待ち続けていることを監視し、接続で何かをすることです(接続を閉じて、さらにデータを送信します-よくわかりません!)。これがどのように機能するかはわかりませんが、可能性のある人に紹介してみます.

私のユースケースでは、2番目の解決策がうまくいきます。もしあなたがそれを偶然見つけたなら、それがあなたにとっても役立つことを願っています!

于 2012-06-14T13:19:37.213 に答える