code up

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

plupload: エラー 8070000c のため操作を完了できませんでした。

Pluploadというファイルアップロードを支援するJavaScriptライブラリを使用していた時に出たエラー。

IE9 + plupload 1.5.2 + Flashランタイムで発生。

エラー 8070000c のため操作を完了できませんでした。

発動条件

エラーコードで調べてもはっきりとした答えが見つからなかったのだが、次の条件の時に発動するようだ。

  • 特定条件においてファイルを選択してファイルを読み込んでいるらしき最中にuploaderのstop()を呼び出す

原因の調査

IEの開発者ツールで見るとscript blockなるもののところにあるコードでこのエラーが発生している。

function __flash__addCallback(instance, name) {
  instance[name] = function () { 
    return eval(instance.CallFunction("<invoke name=\""+name+"\" returntype=\"javascript\">" + __flash__argumentsToXML(arguments,0) + "</invoke>"));
  }
}

エラーコードやこの関数名を頼りに調べながら、次の対策を行ってみた。

  • Flashのバージョンを上げる。ちょっと古かったので最新の11.1.102.62にしてみた
  • Flashのバージョンを下げる。10の最新版である10.3.183.15にしてみた。古いバージョンはこのあたりからダウンロード。バージョンの切り替えがうまくいかない場合は、付属しているアンインストーラー(uninstall_flashplayer10_3r183_15_win.exe/uninstall_flashplayer11_1r102_62_win_64bit.exe)を使うとかタスクマネージャにFlashUtil11f_ActiveX.exeのようなプロセスが残っていたら終了させるとか、再起動するとか
  • swf/objectタグをformの外側においてみる
  • SWFObjectを使ってみる

結局いずれもダメだった。巨大なファイル(100MB)を分割アップロードでテストしていたのだが、このエラーを何度も見ているうちに最初でも述べたが次の条件で発生しているようであることが分かった。

  • 特定条件においてファイルを選択してファイルを読み込んでいるらしき最中にuploaderのstop()を呼び出す

巨大なファイルを選択するとしばらくアップロードが始まらない。数秒後にアップロードが始まるのだが、アップロードが始まってからup.stop()すると上記のエラーは出ず、ファイル選択後すぐ(つまりファイルがアップロード始まっていない状態)だとエラーとなっていることがわかったからだ。

Flashのソースコードから

FlashのソースコードFile.asにはsimpleUploadadvancedUploadの2種類のアップロード方法が実装されている。

このうち特定条件においてadvancedUploadが呼ばれ、その最中にアップロードを中断するとこの例外が発生しているように思う。

次のコードはsimpleとするかadvancedとするかを判定している。

public function canUseSimpleUpload(settings:Object):Boolean {
	var multipart:Boolean = new Boolean(settings["multipart"]);
	var resize:Boolean = (settings["width"] || settings["height"] || settings["quality"]);
	var chunking:Boolean = (settings["chunk_size"] > 0);

	// Check if it's not an image, chunking is disabled, multipart enabled and the ref_upload setting isn't forced
	return (!(/\.(jpeg|jpg|png)$/i.test(this._fileName)) || !resize) && multipart && !chunking && !settings.urlstream_upload && !settings.headers;
}

これらの条件(画像リサイズ、分割アップロード、urlstream_upload、headersのいずれか)に合致していたら、UploadProgressでアップロードが数%始まるまでup.stop()を呼ばないようにするしかないのかなぁ、と思う。

Flash Playerデバッグ版

次にFlash Playerのデバッグ版をインストールした。今度は違うエラーが出た。

TypeError: Error #1009: null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。
	at com.plupload::File/cancelUpload()[plupload_1_5_2_dev\plupload\src\flash\plupload\src\com\plupload\File.as:100]
	at com.plupload::Plupload/cancelUpload()[plupload_1_5_2_dev\plupload\src\flash\plupload\src\com\plupload\Plupload.as:370]
	at Function/http://adobe.com/AS3/2006/builtin::apply()
	at flash.external::ExternalInterface$/_callIn()
	at Function/()

該当の箇所は、ファイルの送信ストリームを閉じるところ。開始(start)してすぐ終了(stop)させるとそのストリームがないので、NullPointerExceptionのようなものが出てるみたい。

関連記事
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。