在表单提交之前生成上传URL

时间:2014-07-10 06:11:03

标签: javascript jquery python google-app-engine blobstore

我试图通过在上传文件之前延迟它们的生成来解决过期的上传URL,而不是在呈现表单时。我找到的解决方案是在表单提交或按钮点击事件上执行此操作:

$('#btn-upload').click(function(event){
  event.preventDefault();

  var uploadUrl = '';
  $.get( "/generate_upload_url", function(data) {
    uploadUrl = data;
  });

  $('#my-form').attr('action', uploadUrl);
});

在服务器端,我有一个Handler,可以生成上传网址:

class GenerateUploadUrlHandler(BaseHandler):
    def get(self):
        upload_url = blobstore.create_upload_url('/upload')
        self.response.headers['Content-Type'] = 'text/plain'
        self.response.out.write(upload_url)

我希望当我点击按钮生成新的上传网址并在那里发出POST请求时,会发生什么情况是表单的操作充满了延迟,POST请求是对错误的URL完成的。我怀疑这可能是因为我正在做异步GET请求并且我的表单同时提交,但我不完全确定,因为我在这里看到类似的示例: http://blog.notdot.net/2010/04/Implementing-a-dropbox-service-with-the-Blobstore-API-part-3-Multiple-upload-support

3 个答案:

答案 0 :(得分:2)

我不喜欢在使用ajax时将异步设置为false。如果服务器没有响应,它可以完全杀死你的页面。

您可以尝试使用表单提交事件而不是按钮单击事件来绑定事件处理程序。并在ajax调用的success事件中设置表单的action属性,然后触发表单的submit事件

$('#my-form').submit(function(event){
  event.preventDefault();

  var uploadUrl = '';
  $.get( "/generate_upload_url", function(data) {
    uploadUrl = data;
    $('#my-form').attr('action', uploadUrl);
    $('#my-form').trigger("submit");
  });


});

答案 1 :(得分:1)

要尝试两件事:

1)将$('#my-form').attr('action', uploadUrl);放在上面的$.get()'成功回调中。

2)如果不起作用,请从$.get()切换到$.ajax(),并将async设置为false。

答案 2 :(得分:-2)

我通过将$.get()更改为$.ajax({async:false})来解决这个问题,所以我想我不应该通过异步请求来做到这一点。