[解決済み] canvas.toDataURL() SecurityError
質問
グーグルマップを使っているのですが、このような画像が表示されます。
<img id="staticMap"
src="http://maps.googleapis.com/maps/api/staticmap?center=Brooklyn+Bridge,New+York,NY&zoom=13&size=600x300&maptype=roadmap
&markers=color:blue%7Clabel:S%7C40.702147,-74.015794&markers=color:green%7Clabel:G%7C40.711614,-74.012318
&markers=color:red%7Ccolor:red%7Clabel:C%7C40.718217,-73.998284&sensor=false">
保存したいのですが これを発見しました。
function getBase64FromImageUrl(URL) {
var img = new Image();
img.src = URL;
img.onload = function() {
var canvas = document.createElement("canvas");
canvas.width = this.width;
canvas.height = this.height;
var ctx = canvas.getContext("2d");
ctx.drawImage(this, 0, 0);
var dataURL = canvas.toDataURL("image/png");
alert(dataURL.replace(/^data:image\/(png|jpg);base64,/, ""));
};
}
しかし、私はこの問題を得る。
Uncaught SecurityError: HTMLCanvasElement' で 'toDataURL' の実行に失敗しました: 汚染されたキャンバスはエクスポートされない可能性があります。
修正方法を検索してみました。ここにサンプルがありました。
CORSの使用方法
が、それでも私はこの2つのコード片を結びつけて動作させることができません。多分私はそれを行うには間違った方法と、それを行うには、より簡単な方法があるのでしょうか?私は私のサーバーにデータを転送することができるように、この写真を保存しようとしています。だから、多分誰かがこのようなことをしたし、どのように作るかを知っている
.toDataURL()
は私がそれを必要とするように動作する方法を知っていますか?
どのように解決するのですか?
googleがこの画像を正しい
Access-Control-Allow-Origin
ヘッダを付けて提供しない限り、canvas でその画像を使用することはできません。これは
CORS
の承認がないためです。これについては
はこちら
をご覧ください。しかし、本質的には
キャンバスで CORS の承認なしに画像を使用することはできますが、そのようなことをするとキャンバスが汚染されます。 を使用すると、canvas が汚染されます。canvas が汚染されると、次のことができなくなります。 canvas からデータを引き出すことができなくなります。たとえば、次のようなことができなくなります。 たとえば、canvas の toBlob()、toDataURL()、getImageData() メソッドは使用できなくなります。 メソッドは使用できません。使用すると、セキュリティ エラーが発生します。
これにより、ユーザーが画像を使って遠隔の Web サイトから情報を取得する際に、個人情報が漏えいするのを防ぐことができます。 を使用して許可なくリモート Web サイトから情報を取得することにより、個人データが公開されることを防ぎます。
サーバーサイドの言語にURLを渡して、画像をダウンロードするためにcurlを使用することをお勧めします。しかし、これをサニタイズするのに注意してください!
EDITです。
この回答はまだ受け入れられている回答なので、以下を確認してください。 shadyshrif さんの回答 を使用することです。
var img = new Image();
img.setAttribute('crossOrigin', 'anonymous');
img.src = url;
これは だけです。 は正しい権限を持っている場合にのみ動作しますが、少なくともあなたが望むことを可能にします。
関連
-
[解決済み】SecurityError: オリジンを持つフレームがクロスオリジンフレームにアクセスするのをブロックした
-
[解決済み] 文字列のn番目の出現箇所を取得するには?
-
[解決済み] 兄弟ノードを選択する方法はありますか?
-
[解決済み] Javascript 空の配列の削減
-
[解決済み] サブドメインにまたがってlocalStorageを使用する
-
[解決済み] moment.jsでミュータビリティを回避するには?
-
[解決済み] <ng-content>が空かどうかを確認する方法は?(これまでのAngular 2+で)
-
[解決済み] HTML要素にスクロールバーがあるかどうかをチェックする
-
[解決済み] これは純関数ですか?
-
[解決済み] なぜcanvas.toDataURL()はセキュリティ例外を投げるのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] ジェスト あるクラスの特定のメソッドをモックする方法
-
[解決済み] Angularjs - 現在の日付を表示する
-
[解決済み] 文字列がhtmlであるかどうかをチェックする
-
[解決済み] オブジェクトの配列からReactコンポーネントをレンダリングする
-
[解決済み] JavaScriptで文字列を数値に変換する最速の方法は何ですか?
-
[解決済み] jqueryはjavascriptのライブラリなのかフレームワークなのか?[クローズド]
-
[解決済み] jQueryを使用して、すべてのクリックイベントハンドラを削除するにはどうすればよいですか?
-
[解決済み] JavaScript で `throw` の後に `return` をする必要がありますか?
-
[解決済み] 変異を伴わないオブジェクトからの値の削除
-
[解決済み] 画像のURLをBase64に変換する