Я пишу приложение, где я хочу, чтобы клиент смог загрузить на Amazon S3 прямо от браузера. Я могу заставить это работать просто великолепно. Но когда ошибки происходят, я хочу обработать их более корректно, чем обрызгивание XML-документа об экране клиента.
У меня есть схема, что я думаю, работал бы, но она перестала работать. Вот то, что я пробую:
Так, что-то вроде этого:
с этим JavaScript (использующий jQuery):
function handler() {
var message = $("#foo").contents().find('message').text();
alert(message);
}
$("#foo").load(handler);
Используя поджигателя, я вижу, что iframe содержит XML-документ, который содержит узел "сообщения". Однако .find('message')
всегда сбои для нахождения чего-либо в рамках XML-документа.
Заметьте, что действие формы имеет тот же домен, порт и схему как сам документ. Так, я не думаю, что должен сталкиваться с политикой того-же-источника.Правильно? Но это перестало работать каждый раз. Это использует браузеры Google Chrome и Firefox.
Спасибо за любой совет!
Существует ряд подключаемых модулей jQuery, которые эффективно реализуют именно то, что вы пытаетесь сделать. Выполните поиск в Google по запросу «jQuery ajax-upload», вы можете просто использовать один из этих элементов управления прямо из коробки, чтобы захватить результат публикации или изучить их код и свернуть свой собственный.
Вы также можете изучить некоторые из загрузчиков на основе Flash, если вы загружаете большие файлы. Метод загрузки в чистом виде не позволяет реализовать процесс загрузки, по крайней мере, до тех пор, пока новые файловые функции не будут широко распространены в браузерах, что и предлагает Flash. http://github.com/slaskis/s3upload#readme - хороший загрузчик файлов на основе флэш-памяти, специально разработанный для S3 и предоставляющий вам функции обратного вызова в JavaScript для обработки ошибок, прогресса и многого другого.
Это должен быть просто комментарий, но можете ли вы опубликовать XML-код ответа?
EDIT: Чтобы немного сузить круг поиска, я сделал простой тест и он работал действительно хорошо:
<div id="foo">
<error>
<code>AccessDenied</code>
<message>Invalid according to Policy: Policy expired.</message>
<hostid> SZuQn5hTyf32j79AWUym1/si48oqjPifrx4goDVDLYYxc6cJVbbHroLJYcAM89+T</hostid>
</error>
</div>
Затем я сделал немного кода jQuery на моем firebug:
$("#foo").find("message").text()
Может быть вы можете дать alert($("#foo").html())
и проверить ответ...
Я думаю, что вы пытаетесь решить не ту проблему. Проблема не в деталях, с фреймами и тому подобном, а в том, что вы хотите иметь более точный контроль над загрузкой. Загрузите файл на свой сервер, затем отправьте запрос на сервер Amazon, и вы получите полный контроль над тем, что происходит.
Конечно, значительно сложнее, но это цена контроля.