首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >AjaxForm和应用程序引擎blobstore

AjaxForm和应用程序引擎blobstore
EN

Stack Overflow用户
提问于 2010-06-21 04:59:24
回答 3查看 2.4K关注 0票数 16

我在AjaxForm文件上传和应用程序引擎blobstore方面遇到了一些困难。我怀疑困难是因为blobstore上传处理程序(blobstore_handlers.BlobstoreUploadHandler的子类)要求重定向响应,而不是返回任何内容,但我不确定。我希望得到一个XML文档来处理,它似乎像预期的那样到达浏览器,但我就是拿不到它-详细信息如下。

我的应用程序引擎blobstore上传处理程序如下-

代码语言:javascript
复制
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。查看服务器输出,没有任何迹象表明有任何错误-重定向得到了服务,并且它按照预期返回具有正确mime类型的xml文档-因此表单提交看起来很好,服务器对该提交的响应也很好。

我使用ajaxForm编写的客户端代码如下所示(抱歉,这有点迟钝,但我不认为问题出在这里)-

代码语言:javascript
复制
// 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));
         }
      });
    });

之后,我在表单上设置了“action”(并启用了按钮)-

代码语言:javascript
复制
$.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文档。日志输出如下:

代码语言:javascript
复制
[ 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请求-其标题看起来很好-

代码语言:javascript
复制
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文档看起来很好。然而,火狐给出了相同的最终结果-- ajaxSubmit() responseText为空。

我想我只是在这里的某个地方有点神志不清,但这真的把我难住了。任何获取该xml文档的指针都将是非常有用的,

科林

EN

回答 3

Stack Overflow用户

发布于 2010-12-02 19:53:46

以下是我使用的方法(仅在Chrome中测试)稍作修改。它不是AjaxForm,但它可以工作。

代码语言:javascript
复制
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‘字段(单位是字节)的对象。它并不关心服务器的响应。

票数 4
EN

Stack Overflow用户

发布于 2011-03-28 20:43:12

下面是我解决这个问题的方法。我添加了一个在javascript send中随文件一起生成的随机id。上传完成后,将我的服务器配置为记住该随机id与上传文件的关联一段时间。我发送另一个查询到一个预定义的url,比如mysite.com/blobdata/that_random_id_i_renerated,请求刚刚上传的文件。啊,真灵。

票数 1
EN

Stack Overflow用户

发布于 2010-11-24 16:22:48

如果你被同样的问题困扰了5个月..我认为你应该在这里问:

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3080922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档