Не могу использовать ajax-upload из-за кометного сервера ape
Первая часть описания - попытка небезопасного JavaScript получить доступ к фрейму при попытке загрузить файл с помощью ajax. Проблема заключается в том, что при попытке загрузить файл с помощью ajax-пути возникает ошибка "Отказано в доступе".
После долгой отладки я обнаружил, что все работает, если я не загружаю ape client. Обезьяна является комет-сервером http://www.ape-project.org/
Ape создает iframe с помощью src = " http://8.ape.readbox.cz:6969/?...". Если я отключаю ape и этот iframe не создается, у меня нет проблем с доступом к документу iframe, созданному для ajax-upload.
Togather они похожи
<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 ответа
К сожалению, я не могу дать вам конкретное решение. Суть проблемы заключается в следующем:
Чтобы 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 на вашей странице.
Это не то хорошее и надежное решение, которое вы, вероятно, ищете, но я надеюсь, что оно проливает немного света на источник проблемы.
Я использую 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);
(это просто перемещение второй фигурной скобки вверх)