У меня возникли трудности с загрузкой файла AjaxForm и блоком blobstore. Я подозреваю, что это связано с тем, что обработчик загрузки blobstore (подкласс blobstore_handlers.BlobstoreUploadHandler) требует ответа на перенаправление, а не возврата какого-либо контента, но я не уверен. Я ожидаю получить XML-документ для работы с ним, и он, как ожидается, появится в браузере, но я просто не могу его удержать - подробности ниже.
Мой обработчик загрузки blobstore моего приложения выглядит следующим образом:
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 dev, я могу увидеть, как 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().
Я полагаю, что у меня просто мозг исчезает где-то здесь, но это действительно меня озадачило. Любые указатели на получение этого XML-документа будут отличными - приветствия,
Колин