2016-06-17 6 views
1

私のウェブアプリケーションでは、ユーザーがURLの種類を束ねています。私のビューは、URLが画像を指しているかどうかに応じて、リンクアイコンまたは画像プレビューを表示しています。JavaScriptを使用して画像のURLを確認する信頼できる方法

実際に画像の場合にのみ画像プレビューを表示する最も信頼性の高い方法は何ですか? <img>を作成し、読み込み時に寸法を確認するか、new Image()オブジェクトを使用するのか、それとも別のものを使用するのですか?

アドバイスありがとうございます。 :)

+0

バックエンドでその仕事をすることはできますか? – VisioN

+0

これらのURLはいつでも変更可能なフィードファイルに含まれているので、私は好きではありません。私はそれの後ろにキャッシングがないのが大好きです。私はAjaxの呼び出しを使用することができますが、バンド幅を増やすことになります。 –

+0

あなたのフィードファイルには、ファイルが画像であるかどうかの情報が含まれている必要があり、それに応じてフロントエンドはそれに応じてデータを表示する必要があります。とにかく 'new Image'オブジェクトは、出力を操作するために使用できる[' onerror'](https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/onerror)イベントをサポートしています。あるいは、私はリンクを 'background-image'スタイルでハックして、JavaScriptを一切取り除こうとするかもしれません。 – VisioN

答えて

1

ソースポイントが有効な画像であるかどうかを確認する最も信頼性の高い互換性のある方法は、Imageオブジェクトを使用することです。それが引き金となり、画像onloadとしてそれを読み込むことができ、そうでない場合はonerrorがトリガされます:

var img = new Image; 
img.onload = function() { /* OK */ }; 
img.onerror = function() { /* cannot read this as an image */ }; 
img.onabort = function() { /* connection or source was reset */ }; 
img.src = "URLtoCheckHere"; 

を欠点は、ブラウザがそれを読み、解読できるかどうかを調べることができる前に画像全体がロードされることはもちろんです。

何らかの理由でImageを使用できない場合は、XHR経由でソースポイントを読み取ることができますが、それには独自の制限があります(cross-origin resource sharing)。イメージが同じ起源(プロトコル、ドメイン、ポートなど)でなく、外部サーバーがコス使用を許可しない場合、読み込みは単に失敗するだけです。

しかし、これらの制限が問題ではない場合(つまり、画像がページや親しみやすいサイトと同じサーバーからのものである場合)、画像の一部をArrayBufferとして読み取って、magic numbersにあなたがサポートしたい画像タイプ。バイトオーダーに注意してください。

範囲を指定するには、Range headerを使用します(ただし、サーバーがそれを尊重するかどうかはわかりません)。ファイルの一部を仮定し

ArrayBufferに読み込まれました:ファイルが有効なイメージファイルとして検出された場合でも、

var reader = new DataView(arrBuffer); 

if (reader.getUint32(0) === 0x89504E47 && 
    reader.getUint32(4) === 0x0D0A1A0A) { 
    // this seem to be a PNG file 
} 
else ... etc. 

しかし、ファイルが破損していないことの保証はありませんし、そうです。このメソッドを使用してファイルを検証する方法はありません(あなた自身でパーサーを書くことを選択しない限り)。

結論として、ほとんどのシナリオではImageが最善の選択肢です。メインブラウザで何年も何度も繰り返してきましたが、かなり堅牢で安定しています。

+0

あなたはCORSがXHRに影響を与えてImage()をしないと言っていますか? – vitr

+1

イメージno(ロード中および表示中)には影響しません。 Imageを使用して任意のURLを読むことができます。ただし、そのイメージをキャンバスに描画してデータを読み込もうとすると、CORSはストライクしますが、表示目的ではありません。私はここで小さなデモを作った:https://jsfiddle.net/epistemex/ss36e0r4/ – K3N

+1

これを使うことにした:$( "").attr( "src"、src).load(...) ' 。私はいつもJavaScriptの 'Image'が' '以外のものだと思っていましたが、私はそれが気にしませんでした:)この場合エラーハンドラは必要ありませんので、' 'とsrcと' load()必要です。できます! –

関連する問題