LoginSignup
3
3

More than 5 years have passed since last update.

(1/16更新)DBにあるSWFのBinaryデータをDOMに表示しようとしたお話

Last updated at Posted at 2015-01-13

会社で現在進行形で躓いてるのでメモ

HTML
<object data="data:application/x-shockwave-flash;base64,*************..." type="application/x-shockwave-flash" class="flash"></object>

という書き方をしてたのだが、デバッグ(ASP.NET MVC + VS2013Pro)をずーっとGoogle Chromeでやってて気づかなかった。IE11で表示されていない。
本来Win8.1 + IE11で動かすもので、今日偶々IE11で見る機会があってこのページを見たら気づいた。

<object>がダメなのかなと思って<embed><param>を試しても改善無し。
dataのパラメータにURLを渡してやるとIE11でも問題なくFlashが表示される。

swfのデータ量は今のデバッグでは10KB~30KBなんだけど、そもそもデータ量や形式に関しては私の認識ではIE8,9以降辺りで関係なくなってるはず・・・(URLは2048文字制限あるみたいだけど。)

Chromeで表示されてるってことはデータ壊れてるわけでもないだろうし。

なんでかなーーー(´・ω・`)


1/14

どうやらこういうことらしい。

ExternalInterfaceでは対象swfをonLoad以降にロードしてはダメ - blog.katsuma.tv
http://blog.katsuma.tv/2008/11/externalinterface_not_work_on_ie_after_body_on_loaded.html

ActionScriptは使ってないんだけど、要は、IEではDOMのロードが完了した時点でswfファイルの設置が出来てないと読み込んでやらないぞって事っぽい。
document.getElementById.appendChildでもなんでも使って無理矢理にでも埋め込もうと思ったが、document.getElementByIdの時点でアウト。

処理順序でひっかかった - Web系がおもしろい。
http://d.hatena.ne.jp/esperia/20100325/1269515821

ちゃんとwindow.onload時にgetElementById()しないと、DOM構築されてないからgetElementByIdがnullになってしまうよっていう話です。

「swfをonLoad以降にロードしてはダメ」
  +
「window.onload時にgetElementById()しないとnull」
  ||

詰んだ。

といっても、予めBase64化したswfを直書きすれば、出来ます。多分。試してないけど。
やりたいことが、Databaseからbyte[]になってるswfファイルを読んで、ASP.NETMVCのコントローラでBase64化させて、AngularJSとかjQueryとか使ってDOMに埋めようということなので、詰んだというお話。
余談ですが、swfは出来なかったけどpngやjpgは出来ました。

IE滅べ。


1/16

結局どうしたか。

MVC_Controller
public virtual ActionResult GetFlle(byte[] file, string mime)
{
    var ms = new MemoryStream(file, false);
    return new FileStreamResult(ms, mime);
}

これでIEでも表示されるようになった。

が、

納得いかない。

やっぱりIE許せない(´・ω・`)

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3