2012-09-04 6 views
6

SWFUploadを使用して、画像をサーバーに正しくアップロードするようにしようとしています。ユーザーがブラウズボタンをクリックして自分のイメージファイルを選択すると、すぐにイメージがアップロードされないように、データを埋めるフォームがあります。ユーザーが送信ボタンをクリックするまで待ち行列に保持され、次にmySwfUploadInstance.startUpload()を呼び出してアップロードを開始します。SWFUpload startUpload()はfile_dialog_complete_handler内で呼び出されないと失敗します

しかし、それは 'callFlash' 関数でswfupload.jsのライン452で無残に失敗します。

Uncaught Call to ReturnUploadStart failed

このエラーをスローする前にキャッチされている例外は以下の通りです:

Object #<HTMLObjectElement> has no method 'CallFunction'

以下の機能:

SWFUpload.prototype.callFlash = function (functionName, argumentArray) { 
    argumentArray = argumentArray || []; 

    var movieElement = this.getMovieElement(); 
    var returnValue, returnString; 

    // Flash's method if calling ExternalInterface methods (code adapted from MooTools). 
    try { 
     returnString = movieElement.CallFunction('<invoke name="' + functionName + '" returntype="javascript">' + __flash__argumentsToXML(argumentArray, 0) + '</invoke>'); 
     returnValue = eval(returnString); 
    } catch (ex) { 
     throw "Call to " + functionName + " failed"; 
    } 

    // Unescape file post param values 
    if (returnValue != undefined && typeof returnValue.post === "object") { 
     returnValue = this.unescapeFilePostParams(returnValue); 
    } 

    return returnValue; 
}; 

movieElementは有効なフラッシュオブジェクトであるように見えます。

私はSWFUploadの初期化時file_dialog_complete_handlerに渡す関数内startUpload()を呼び出した場合、私はそのエラーを取得しない:

function ImageFileDialogComplete(numFilesSelected, numFilesQueued) 
{ 
    try 
    { 
     this.startUpload(); 
    } 
    catch (ex) 
    { 
     this.debug(ex); 
    } 
} 
私は本当にユーザーが完了したときに、アップロードを延期できるようにする必要があり

フォームを開き、送信ボタンをクリックします。

ダイアログ完了ハンドラからstartUpload()を呼び出すと、SWFUPloadで何が問題になりますか?

答えて

14

問題は、startUpload()を呼び出す直前にdisplay:noneを設定して、Flashオブジェクトを含むdivを隠していたためです。私はフォームを隠し、代わりにプログレスバーでdivを表示するためにこれをやっていました。

何らかの理由で、フラッシュオブジェクトが画面に表示されたままになっている必要があります。それ以外の場合は、すべての呼び出しが失敗します。

+3

この回答を投稿していただきありがとうございます。私は何時間ものデバッグを保存しました。 – Jeremy

+0

もっと良い解決策がありますか?私はアップロード後にコンテナを隠す必要があります。 – Teddy

+0

私はコンテナを隠す代わりに、より良い解決策を得ました。コンテナの幅と高さを1ピクセルに設定し、ブロックを表示しました。 – Teddy

関連する問題