0

いくつかの画像アップロード機能を必要とする Facebook アプリを作成しました。それを実装するために、Fine Uploader を使用しています。

Facebook アプリ自体は WordPress で構築されており、すべて正常に動作しています。最終的に、WordPress Web サイト (アプリ) は Facebook の iframe で公開される予定で、ここで興味深いことが起きています。

ローカル マシンでアプリをテストすると、動作します (すべてのブラウザー)。ステージング環境で iframe の外側でアプリをテストすると、アプリも動作します (すべてのブラウザー)。ただし、Facebook (iframe) のテスト ページでアプリをテストすると、IE でのみ画像のアップロードが失敗します。

For reference I will show my server and client code:

public static function upload_receiver()
{
    $uploader = new qqFileUploader();
    $uploader->allowedExtensions = array("jpg", "jpeg");
    $uploader->sizeLimit = 2024 * 1024;

    $wp_upload_dir = wp_upload_dir();
    $wp_upload_url = $wp_upload_dir['baseurl'];
    $wp_upload_base = $wp_upload_dir['basedir'];

    $upload_dir = $wp_upload_base;
    $upload_filename = md5(mt_rand())/*.'_'.$uploader->getName()*/.".jpg";

    $result = $uploader->handleUpload( $upload_dir, $upload_filename );

    // Create the WordPress image thumbs.
    $img_target = "{$upload_dir}/{$upload_filename}";

    $wp_filetype = wp_check_filetype( $img_target );

    $attachment_data = array(
        'post_mime_type' => $wp_filetype['type'], 
        'guid' => $img_target,
        'post_title' => preg_replace('/\.[^.]+$/', '', $upload_filename ),
        'post_name' => preg_replace('/\.[^.]+$/', '', $upload_filename ),
        'post_content' => '',
        'post_status' => 'inherit',
    );

    $attachment_id = wp_insert_attachment( $attachment_data, $img_target );

    $meta = wp_generate_attachment_metadata($attachment_id, $img_target);

    wp_update_attachment_metadata($attachment_id, $meta);   

    $result['attachmentId'] = $attachment_id;
    $result['imageUrl'] = htmlspecialchars( get_image_url_from_attachment_id($attachment_id, "thumb-small") );

    header("Content-Type: text/plain");
    echo json_encode( $result );

    die();
}

And the client:

var el = $('#upload');
var el_img = el.find('span');

el.fineUploader( {
    uploaderType: 'basic',
    button: el,
    multiple: false,
    request: {
        endpoint: '<?php echo site_url("/wp-admin/admin-ajax.php") ?>',
        params: {
            action: 'upload_receiver'           
        }
    },
    validation: {
        allowedExtensions: ['jpeg', 'jpg']
    },
    debug: false
} ).on('upload', function(event, id, fileName, response) {
    $('.loader').show();
    $('.upload_button_container').hide();

} ).on('complete', function(event, id, fileName, response) {

    // ONLY IN IE "RESPONSE.SUCCESS" IS FALSE IN AN FB IFRAME. ALL OTHER
    // TIMES "RESPONSE.SUCCESS" IS TRUE AND ALL PROPERTIES CREATED ON THE
    // SERVER EXIST.

    $('.loader').hide();
    $('.upload_button_container').show();

    if( response.error )
    {
        alert( response.error );
        return;
    }

    // Display image coming in from the result.
    $(".img_upload_container img").attr('src', response.imageUrl).show();

    // Store the WordPress attachment Id for form submission.
    $("form input[name=bc_attachment_id]").val( response.attachmentId );
});

I have been banging my head on this for the past few hours and I've run out of ideas of might be causing this issue.

EDIT:

IE9 console output:

LOG: [FineUploader] Processing 1 files or inputs... 
LOG: [FineUploader] Sending upload request for 0 
SEC7111: HTTPS security is compromised by res://ieframe.dll/forbidframing.htm 
SEC7111: HTTPS security is compromised by res://ieframe.dll/ErrorPageTemplate.css 
SEC7111: HTTPS security is compromised by res://ieframe.dll/errorPageStrings.js 
SEC7111: HTTPS security is compromised by res://ieframe.dll/httpErrorPagesScripts.js 
SEC7111: HTTPS security is compromised by res://ieframe.dll/red_x.png 
SEC7111: HTTPS security is compromised by res://ieframe.dll/bullet.png 
SEC7111: HTTPS security is compromised by res://ieframe.dll/background_gradient.jpg 
LOG: [FineUploader] Received response for 0 
[FineUploader] Error when attempting to access iframe during handling of upload response (Error: Access is denied.
) 
LOG: [FineUploader] iframe loaded 
[FineUploader] Error when attempting to parse form upload response (Error: Access is denied.
) 
4

2 に答える 2

0

私が推測したように、問題は、親ウィンドウのドメインが、応答を含む iframe のドメインと一致しないことです。これはセキュリティ違反であり、別のドメインにあるため、この iframe のコンテンツにアクセスする簡単な方法はありません。この種のアクセスは、ブラウザによって禁止されています。これを回避するのは少し難しいですが、Fine Uploader がその方法を提供します。

Fine Uploader で CORS 機能を有効にする必要があります。これはおそらく最良の選択肢であり、これで問題が解決するはずです。Fine Uploader は最近、クロスドメイン リクエストのサポートを追加しました (バージョン 3.3)。これは、iframe が関係する IE で特に役立ちます。基本的に、応答を含む親ウィンドウにメッセージを投稿する JavaScript ファイルをインポートするように応答を構成します。これが、Fine Uploader がクロスドメインの問題を克服する方法です。Fine Uploader での CORS サポートと、それを有効にしてサーバー側コードで Fine Uploader から送信されたクロスドメイン リクエストを適切に処理する方法について 、詳細なブログ記事を書きました。

投稿を読んでサーバー側の指示に従えば、問題ないようです。

あなたの場合、これはIE9以前で克服する必要がある問題にすぎないように思われることに注意してください。必要な作業の概要は次のとおりです。

  1. Fine Uploader (クライアント側) で CORS サポートをオンにします。
  2. サーバー側: リクエストの X-Requested-With ヘッダーを見て、XHR 以外のアップロード リクエストを識別します。
  3. <script>リクエストが XHR 経由で送信されなかった場合は、既知の場所 (任意の場所) から「iframe.xss.response.js」ファイルをインポートするタグで始まる、コンテンツ タイプが「text/html」のレスポンスを返します。 . 応答の script タグの後に、応答の通常の有効な JSON 部分を含めます。

お役に立てれば。

于 2013-04-20T03:43:40.717 に答える