Не могу использовать ajax-upload из-за кометного сервера ape - PullRequest
1 голос
/ 10 июня 2010

Первая часть описания находится в Небезопасная попытка JavaScript получить доступ к фрейму при попытке загрузить файл с помощью ajax Проблема в том, что при попытке загрузить файл с помощью ajax-way возникает ошибка «Отказано в доступе».

После долгой отладки я обнаружил, что все работает, если я не загружаю ape-клиент.Ape - это сервер комет http://www.ape -project.org /

Ape создает iframe с src = "http://8.ape.readbox.cz:6969/?...". Если я отключаю ape, и этот iframe не создается, тогда яУ меня нет проблем с доступом к документу iframe, созданному для ajax-upload.

Вместе они выглядят так:

<iframe src="http://8.ape.readbox.cz:6969/?..." style="display: none; position: absolute; left: -300px; top: -300px;" id="ape_undefined"></iframe>
<iframe style="display: none;" id="ValumsAjaxUpload0" src="javascript:false;" name="ValumsAjaxUpload0"></iframe>

Пожалуйста, кто-нибудь может мне помочь? Я в замешательстве.

Ответы [ 2 ]

2 голосов
/ 04 ноября 2010

К сожалению, я не могу дать вам конкретное решение. Суть проблемы заключается в следующем:

Для того чтобы APE могла выполнять междоменные (на самом деле, субдомены) вызовы POST, ape необходимо сбросить document.domain (глобальная переменная окна), избавившись от префикса домена (www., Beta. И т. Д.). ..). Несмотря на то, что 0.ape.YOURDOMAIN.com ограничен междоменными доменами с сайта www.YOURDOMAIN.com, ему разрешены права на один домен с YOURDOMAIN.com. К сожалению, для того, чтобы iframe вашего загрузчика получил доступ к родительскому окну, он также должен быть из того же домена. Сброс document.domain меняет это.

Одним из решений является изменение метода XHR по умолчанию APE с «POST» на «GET». Очевидно, что вы можете делать запросы на получение доступа от иностранных доменов, но вы ограничены в количестве данных, которые вы можете отправить. Кроме того, вам придется закомментировать строку javascript, которая сбрасывает document.domain на вашей странице.

Это не то хорошее и надежное решение, которое вы, вероятно, ищете, но я надеюсь, что оно проливает немного света на источник проблемы.

0 голосов
/ 14 апреля 2012

Я использую jQuery Form Plugin и комет-сервер APE, и застрял с той же проблемой при загрузке файла с использованием iframe.Вот мое решение (использование статического iframe вместо динамического):

Добавьте следующий код на страницу, загружаемую ДО запуска APE:

<iframe id="file_upload_iframe" name="file_upload_iframe" src="iframe_src.html" style="position: absolute;left: -300px;top:-300px; width:0px;height:0px;"></iframe>

Добавьте на сайт страницу iframe_src.html (исходный источник статического iframe):

<html>
<head>
</head>
<body> 
<script type="text/javascript">
  document.domain = document.domain;  <!-- this is the main line -->
</script>
</body>
</html>

Цель этой страницы - разрешить плагину формы отправлять первоначальную форму, избегая ошибки разрешения.
Приложение должно вернуть ответследующим образом:

<html>
<head></head>
<body> 
<script type="text/javascript">document.domain = document.domain;</script>
<textarea>' + YOUR_DATA_TO_RETURN + '</textarea>
</body>
</html>

То есть, чтобы избежать ошибки "Отказано в разрешении" при второй и последующих отправках формы.

Код для отправки формы на стороне клиента:

$('#image_add_commit').click(function(){
    $('#file_upload_iframe').unbind();//may be it is unnecessary
    $('#image_add_form').ajaxSubmit( 
        {success: image_add_complete,
        iframe: true,
        iframeTarget: $('#file_upload_iframe').get(0),
        dataType: 'html',
        textarea: true});
}); 

function image_add_complete(data){
   //data variable contains YOUR_DATA_TO_RETURN that was wrapped in HTML code
}

Модификация в файле jquery.form.js:

Найти блок

            if (!s.iframeTarget) {
                // add iframe to doc and submit the form
                $io.appendTo('body');

                if (io.attachEvent)
                    io.attachEvent('onload', cb);
                else
                    io.addEventListener('load', cb, false);
            }

и изменить его на

        if (!s.iframeTarget) {
            // add iframe to doc and submit the form
            $io.appendTo('body');
        }
            if (io.attachEvent)
                io.attachEvent('onload', cb);
            else
                io.addEventListener('load', cb, false);

(это просто перемещение второго фигурногоГотовься)

...