範囲リクエストでpdf.jsを使用しようとしています(pdfドキュメントのプログレッシブロード)が、amazon s3 urlからpdfをロードしようとすると、このエラーがコンソールに表示されます:
安全でないヘッダー「Accept-Ranges」の取得を拒否しました
また、PDFは206の部分コンテンツ(範囲要求)を介してロードされませんが、200を介してロードされ、PDFのダウンロードが完了すると、ビューアーに表示されます。
これはpdfURLの例です:
https://kotob.s3.amazonaws.com/book.pdf?Signature=irgVfoAZuPPIp5kpCesni2MzpLo%3D&Expires=1366576877&AWSAccessKeyId=AKIAILBHXSTPUIBTRMSA
ヘルプ
これはviewer.htmlまたはfirefox拡張機能で表示されていますか?
Viewer.htmlを使用
クロスオリジンリクエストを行っているため、これは失敗しているように感じます。
Chromeを使用している場合は、これが機能するかどうかを確認してください。
--disable-web-security
(http://stackoverflow.com/questions/3102819/chrome-disable-same-origin-policy)でChromeを実行します。 ファイルをロードするときに、 #disableWorker=true
も追加します。
閉鎖。 それでも問題が解決しない場合は、再度開いてください。
返信ありがとうございます@mduan 、
しかし、同じエラーがまだ私には表示されます、そしてそれをよりよく説明するために、私はビューアをドロップボックスに入れました、そしてこれはあなたがそれを試すことができるパブリックリンクです:
https://dl.dropboxusercontent.com/u/37262502/PDF.js_mduan/pdf.js/web/viewer.html
このビューアはエラーを出します:
しかし、PDFパスをから変更したとき
DEFAULT_URL = ' https://kotob.s3.amazonaws.com/neo.pdf '
に :
DEFAULT_URL = 'neo.pdf'
ファイルを同じビューアディレクトリに配置することで、範囲要求で正常に機能します。
https://dl.dropboxusercontent.com/u/37262502/PDF.js_mduan/pdf.js/web/viewer2.html
また、getリクエストに対して他のオリジンからCORSポリシーにアクセスできるようにしていることに注意してください。
それが問題の説明に役立つことを願っています。
返信が遅くなってすみません、
何か助けはありますか?
ローカルサーバーで問題を再現することができました。 リモートPDFをホストしているサーバーに次のHTTPヘッダーを返すようにすることで、これを機能させることができました。
Access-Control-Allow-Headers: Range
Access-Control-Expose-Headers: Accept-Ranges, Content-Encoding, Content-Length, Content-Range
@mduanにご協力いただき、ありがとうございます。現在は機能しています。
@mahmoudfelfel :問題が修正されたら、この問題を解決できますか? ありがとう! :)
スクリプト言語(PHP、RoR、Pythonなど)のプロキシファイルは非常に簡単なソリューションです。
私は同じエラーに遭遇しました。 そして私の意見では、これはpdf.js内で修正できる/修正する必要があります。
他のドメインからPDFをロードする場合は、私たち自身のドメインです。 プリフライトリクエストは、AWSだけでなく、 Mozillaドキュメントに関しても必須であり、すべてのCORSリクエストに推奨されます。
そうすれば、余分なプロキシインスタンスなどを回避できます。 簡単な回避策として、自分でpdf(プリフライトを使用)リクエストをフェッチし、ByteArrayをpdf.jsに渡すことを試みます。
他のドメインからPDFをロードする場合は、私たち自身のドメインです。 プリフライトリクエストは、AWSだけでなく、Mozillaドキュメントに関しても必須であり、すべてのCORSリクエストに推奨されます。
CORSプリフライトリクエストは、ユーザーのJSの介入なしにXHRによって自動的に生成されます。
簡単な回避策として、自分でpdf(プリフライトを使用)リクエストをフェッチし、ByteArrayをpdf.jsに渡すことを試みます。
完璧な回避策のように聞こえます。すべての非標準の通信手段(CORSを必要としないプレーンなHTTP / HTTPSを除く)はユーザーが処理する必要があります。 XHRでURL(ファイル、BLOB、CORS、認証ヘッダーなど)を適切に構成できることが確実な場合。
閉じても修正されません。
私はv0.8.180
で立ち往生しており、これは古い問題であることを知っていますが、他の人に役立つ場合は、次のS3バケットCORS構成で修正されました。
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
<ExposeHeader>Accept-Ranges</ExposeHeader>
<ExposeHeader>Content-Range</ExposeHeader>
<ExposeHeader>Content-Encoding</ExposeHeader>
<ExposeHeader>Content-Length</ExposeHeader>
</CORSRule>
</CORSConfiguration>
@ jpilloraS3バケットのCORS構成で同じ構成を試しました。 アプリケーションはすべてのブラウザで動作し、FireFoxにはエラーがありません。 Webkit(Chrome / Safari)は引き続きRefused to get unsafe header "Accept-Ranges"
をスローします。
Accept-Ranges: bytes
がpdfファイルのhttpリクエストに存在することに気づきましたが、 Content-Range
またはContent-Encoding
が構成からhttpリクエストに保持されているのがわかりません。
たぶん、Content-Rangeに加えてRangeを公開する必要がありますか?
運が悪かったので撃ちました。 この問題をパントすることにしました。
動作するCORS構成はここにあります: https ://github.com/mozilla/pdf.js/issues/4530#issuecomment -188059771
これを機能させるための鍵は、Access-Control-Allow-Headersの「範囲」です。
私の場合、ストリーミングオーディオコンテンツの場合、これらのヘッダーはとにかく機能していませんでした
@simoncpuあなたの発見に感謝します!
非常によく似た問題がありますが、オーディオコンテンツに関するものです。 私の場合、これらのヘッダーは機能しません
{ 'Content-Length': 5751405,
'Content-Type': 'audio/mpeg',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'POST, GET, OPTIONS',
'Access-Control-Allow-Headers': 'Range',
Expires: 0,
Pragma: 'no-cache',
'Cache-Control': 'no-cache, no-store, must-revalidate',
'Accept-Ranges': 'bytes',
'Content-Range': 'bytes 120429-240237/5751405' }
SFについても尋ねました。
最も参考になるコメント
ローカルサーバーで問題を再現することができました。 リモートPDFをホストしているサーバーに次のHTTPヘッダーを返すようにすることで、これを機能させることができました。