現在、キャンバスギャラリーに取り組んでいますが、CORSの問題に悩まされています。だから、私は本当にどの瞬間から始めるべきかわからないので、私が行ったステップを説明し、私の問題を説明しようとします。
序章:
私はCoffeeScript、jQuery、およびAmazonS3に保存されているすべての画像を使用しています。
問題
したがって、バケットの最初のCORS構成は次のようになります。
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>https://level.travel</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>Content-*</AllowedHeader>
<AllowedHeader>Host</AllowedHeader>
<AllowedHeader>Origin</AllowedHeader>
</CORSRule>
<CORSRule>
<AllowedOrigin>https://*.level.travel</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>Content-*</AllowedHeader>
<AllowedHeader>Host</AllowedHeader>
<AllowedHeader>Origin</AllowedHeader>
</CORSRule>
</CORSConfiguration>
および開発環境に関する同様のルール(もちろん、異なるドメイン)。
ギャラリーの初期化では、画像のURLを収集してから、それらに関する情報を収集します。この機能は、コードの次の部分によって提供されます。
images_array.each (i, image)=>
console.log "Loading image #{i}"
canvas_image = new Image
canvas = document.createElement('canvas')
canvas_context = canvas.getContext("2d")
canvas_image.crossOrigin = 'anonymous'
image_index = i
canvas_image.onload = =>
canvas.width = canvas_image.naturalWidth
canvas.height = canvas_image.naturalHeight
canvas_context.drawImage(canvas_image, 0, 0)
localStorage.setItem(@storage_ns(i), canvas.toDataURL('image/jpeg'))
@full_images[i] = $(image).data("fullImage")
@hidden_area.append(canvas)
@progress_event(canvas, image_index)
canvas_image.onerror = => @error_event(image_index)
if canvas_image.complete || canvas_image.complete is undefined
canvas_image.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";
canvas_image.src = $(image).data("thumbImage")
これは私のニーズに合わせて拡張されたMDNソリューションです。
メソッド@progress_event
は、提供されたいくつかの追加情報を使用して、各イメージを配列(メモリ内キャッシュなど)に配置します。この配列は次のようになります。
[
{
image : canvas // the canvas element which will be drawed on main Canvas
small : { ... } // information about small images (eg. size, position)
large : { ... } // similar to small
}
]
次に、最も興味深い部分と(私が思うに)私の問題:
ギャラリーは2本のテープで構成されています(大きな画像と小さな画像が重なり合っています)。両方のテープを描画するには、@render_gallery_tape
2回実行する必要があります。これらの関数は無限ループ(setTimeout
、45 FPS)で実行され、で動作しrequestAnimationFrame
ます。
これは私が呼ぶ方法@render_gallery_tape
です:
@render_gallery_tape('large')
@render_gallery_tape('small')
@render_gallery_tape
は非同期であり、両方の機能が同時に機能します。
私はこれ@render_gallery_tape
を持っています:
// pane is an item of array described above
// @cache_context is a context of off-screen Canvas
@cache_context.drawImage(pane.image,
Math.ceil(current_offset),
Math.ceil(margin_top),
Math.ceil(size.width),
Math.ceil(size.height))
そのため、ギャラリーが小さな(下の)テープをレンダリングしようとすると、セキュリティエラー(CORSポリシー)が発生することがあります。ブラウザは私が間違った起源を持っていると考えています。
これらのイメージを(たとえばnginxを使用して)プロキシできることは理解していますが、EC2を使用しているため、アプリケーションサーバーのトラフィックを増やしたくありません。そのため、S3を使用することを余儀なくされました。
前もって感謝します。
PS必要に応じて、追加情報を提供できます。