Загрузка браузера S3 через POST: не может корректно обрабатывать ошибки - PullRequest
5 голосов
/ 07 февраля 2010

Я пишу приложение, в котором я хочу, чтобы клиент мог загружать в Amazon S3 прямо из браузера. Я могу сделать эту работу просто отлично. Но когда возникают ошибки, я хочу обрабатывать их более изящно, чем разбрызгивать XML-документ на экране клиента.

У меня есть схема, которая, я думаю, будет работать, но она не работает. Вот что я пытаюсь:

  1. Создайте форму для загрузки и сохраните форму на самом S3 в том же домене, что и атрибут «action» формы.
  2. Перенаправить клиента на эту форму. Теперь их браузер сидит на .s3.amazonaws.com/something" rel="nofollow noreferrer">https://.s3.amazonaws.com/something.
  3. Страница содержит скрытый фрейм. Форма устанавливает свою цель на iframe.
  4. Обработчик события load просматривает содержимое iframe и воздействует на него.

Итак, как-то так:

<iframe id="foo" name="foo" style="display: none" />
<form target="foo" action="https://<bucket>.s3.amazonaws.com/">
    <input type="hidden" name="..." value="..." />
    <input type="file" name="file" />
</form>

с этим javascript (используя jquery):

function handler() {
    var message = $("#foo").contents().find('message').text();
    alert(message);
}
$("#foo").load(handler);

Используя firebug, я вижу, что iframe содержит XML-документ, который содержит узел «message». Однако .find('message') всегда не может найти что-либо в XML-документе.

Обратите внимание, что действие формы имеет тот же домен, порт и схему, что и сам документ. Итак, я не думаю, что я должен идти вразрез с политикой того же происхождения. Правильно? Но это терпит неудачу каждый раз. Это использует браузеры Firefox и Google Chrome.

Спасибо за любой совет!

Ответы [ 3 ]

2 голосов
/ 14 мая 2010

Существует несколько плагинов jQuery, которые эффективно реализуют именно то, что вы пытаетесь сделать. Выполните в Google поиск по запросу «jQuery ajax-upload», вы можете просто использовать один из этих элементов управления «из коробки», чтобы зафиксировать результат публикации или проверить их код и свернуть свой.

Возможно, вы захотите взглянуть на некоторые из загрузчиков на основе Flash, если вы загружаете большие файлы. Метод загрузки в чистом виде не имеет никакого способа реализации процесса загрузки, по крайней мере, до тех пор, пока новые файловые функции не будут широко распространены в браузерах, которые предлагает Flash. http://github.com/slaskis/s3upload#readme - это хороший загрузчик файлов на основе флэш-памяти, специально разработанный для S3, который предоставляет функции обратного вызова в JavaScript для обработки ошибок, прогресса и многого другого.

2 голосов
/ 10 февраля 2010

Это должен быть просто комментарий, но вы можете опубликовать XML-код ответа?

РЕДАКТИРОВАТЬ: Просто чтобы немного сузить, я сделал простой тест и работал очень хорошо:

<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()) и проверить ответ ..

0 голосов
/ 15 марта 2010

Я думаю, что вы пытаетесь решить не ту проблему. Проблема не в деталях, с iframes и тому подобным, но в том, что вы хотите лучше контролировать загрузку. Загрузите файл на свой сервер, затем отправьте запрос на сервер Amazon, и вы получите полный контроль над происходящим.

Значительно сложнее, конечно, но это цена контроля.

...