AjaxForm и интернет-магазин приложений - PullRequest
16 голосов
/ 21 июня 2010

У меня возникли некоторые трудности с загрузкой файла AjaxForm и хранилищем приложений для движка приложений.Я подозреваю, что проблема в том, что обработчик загрузки blobstore (подкласс blobstore_handlers.BlobstoreUploadHandler) требует ответа перенаправления, а не возврата какого-либо содержимого, но я не уверен.Я ожидаю получить XML-документ для работы, и он, кажется, поступает в браузер, как и ожидалось, но я просто не могу его достать - подробности ниже.

Мой обработчик загрузки из магазина приложений в онлайн-магазинвыглядит следующим образом -

class UploadHandler(blobstore_handlers.BlobstoreUploadHandler):
  def post(self):
    upload_files = self.get_uploads('file')  # 'file' is file upload field in the form
    blob_info = upload_files[0]

    entity_key = self.request.get("entityKey")

    // Update a datastore entity with the blobkey (not shown)

    // redirect to the uri for the updated entity
    self.redirect('%s.xml' % entity_key)

Последнее перенаправление в URI в моем приложении, которое возвращает документ XML.Если посмотреть на выходные данные сервера, нет никаких признаков того, что что-то не так - перенаправление обслуживается, и он возвращает XML-документ, как и ожидалось, с правильным типом mime - поэтому отправка формы выглядит хорошо, а ответ сервера на эту отправку выглядитхорошо.

Мой код на стороне клиента, использующий ajaxForm, выглядит следующим образом (извините, это немного глупо, хотя я не думаю, что проблема здесь) -

// Create the form
var dialogForm = $("<form method='POST' enctype='multipart/form-data'>")
   .append("<span>Upload File: </span><input type='file' name='file'/><br>")
   .append("<input type='hidden' name='entityKey' value='" + entityKey + "'/>")
   .append("<input type='hidden' name='entityField' value='image'/>")
   .append("<input type='button' value='Wait...' disabled='disabled'/>");;

dialogForm.ajaxForm();

// Turn the form button into a nice jQuery UI button and add a click handler
$("input[type=button]", dialogForm[0]).button()
   .click(function() {
      log.info("Posting to : " + dialogForm.attr('action'));
      dialogForm.ajaxSubmit({
         success: function(responseText, statusText, xhr, $form) {
            log.info("Response: " + responseText + ", statusText: " + statusText + ", xhr: " + goog.debug.expose(xhr) + ", form:" + goog.debug.expose($form));
         }
      });
    });

Я установил 'действие' наформа (и включите кнопку) впоследствии -

$.get('/blob_upload_url', function(data) {
  dialogForm.attr("action", data);
  $("input[type=button]", dialogForm[0]).attr("value", "Upload").button("option", "disabled", false);
};

Я использую маленькое закрытие Google там также для регистрации и выставления объектов.Все выглядит хорошо - как и ожидалось, он правильно отправляет на сервер, и вызывается функция успеха.Если я просматриваю структуру документа в инструментах разработчика Chrome, я вижу, как ненадолго создается iFrame для обработки загрузки файла и ответа.

Проблема заключается в том, что я никогда не получаю документ XML в ответе.Вывод журнала выглядит следующим образом -

[ 18.642s] [Panel] Response: null, statusText: success, xhr: 0 = [object HTMLFormElement]
length = 1
selector = 
jquery = 1.4.2, form:0 = [object HTMLFormElement]
length = 1
selector = 
jquery = 1.4.2
Resource interpreted as document but transferred with MIME type application/xml [ABCdefGH]

Жалоба chrome на тип mime, вероятно, очень актуальна, но я не устанавливаю соединение :) - по крайней мере это означает, что он получает xmlдокумент в какой-то момент.В представлении ресурсов Chrome вы можете увидеть POST, ответ - перенаправление 302, а затем последующий запрос GET - заголовок которого выглядит нормально -

Request URL:http://localhost:8081/_ah/upload/ABCdefGH
Request Method:GET
Status Code:200 OK
Request Headers
Referer:http://localhost:8081/
User-Agent:Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.70 Safari/533.4
Response Headers
Cache-Control:no-cache
Content-Length:2325
Content-Type:application/xml
Date:Sun, 20 Jun 2010 20:47:39 GMT
Expires:Fri, 01 Jan 1990 00:00:00 GMT
Server:Development/1.0

Представление ресурсов Chrome не будет отображатьсяМне содержимое этого документа (просто пусто), но Firefox делает, и документ XML выглядит нормально.Firefox дает тот же конечный результат - null для ajaxSubmit () responseText.

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

Колин

Ответы [ 3 ]

4 голосов
/ 02 декабря 2010

Вот метод, который я использовал (только проверенный в Chrome), немного измененный.Это не AjaxForm, но он работает.

function upload_files(entityKey, files, url, progress_callback) {
  var xhr = new XMLHttpRequest(), formData = new FormData();
  xhr.upload['onprogress'] = progress_callback;

  formData.append('entityKey', entityKey);
  $.each(files, function(i, file) { formData.append('file[]', file);});

  xhr.open("post", url, true);
  xhr.setRequestHeader("Cache-Control", "no-cache");
  xhr.send(formData);
}

entityKey доступен в качестве параметра на сервере.Параметр 'files' берется из атрибута 'files' элемента формы ввода файлового типа (в виде массива для поддержки нескольких).Параметр progress_callback - это функция, которая принимает объект, который имеет (по крайней мере) поле «загружено» и «общее» (единица измерения - байты).Его не волнует ответ сервера.

1 голос
/ 28 марта 2011

вот как я это решил. Я добавил случайный идентификатор, сгенерированный в javascript send вместе с файлом. После завершения загрузки настройте мой сервер так, чтобы он на некоторое время запомнил связь этого случайного идентификатора и загруженного файла. Я отправляю другой запрос на предварительно определенный URL-адрес, такой как mysite.com/blobdata/that_random_id_i_renerated, чтобы запросить загруженный файл это сработало.

0 голосов
/ 24 ноября 2010

Если вы 5 месяцев застряли на той же проблеме .. Я думаю, вы должны спросить здесь:

http://www.google.com/support/forum/p/Chrome/

...