gpt4 book ai didi

jquery - AjaxForm 和应用引擎 blobstore

转载 作者:太空宇宙 更新时间:2023-11-03 15:18:21 25 4
gpt4 key购买 nike

我在使用 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)

最终重定向到我的应用程序中返回 xml 文档的 uri。查看服务器输出,没有任何迹象表明有任何问题 - 重定向得到服务,并按预期返回 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 资源 View 中,您可以看到 POST,响应是 302 重定向,然后是后续的 GET 请求——其 header 看起来不错——

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 资源 View 不会向我显示该文档的内容(只是空白),但 firefox 会显示,而且 xml 文档看起来不错。然而,Firefox 给出了相同的最终结果 - ajaxSubmit() 响应文本为 null。

我想我只是在这里某处的大脑逐渐消失,但它真的让我感到难过。获取该 xml 文档的任何指示都会很棒 - 干杯,

科林

最佳答案

这是我使用过的方法(仅在 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'参数是一个函数,它接受一个对象,该对象具有(至少)一个'loaded'和一个'total'字段(单位是字节)。它不关心服务器响应。

关于jquery - AjaxForm 和应用引擎 blobstore,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3080922/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com