2014-07-10 27 views
-1

我正在嘗試通過在文件上傳之前延遲其生成而不是在呈現表單時解​​析過期的上傳URL。我發現了一個解決方法是做到這一點的形式提交或按鈕點擊事件,像這樣:在表單提交之前生成上傳url

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

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

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

而在服務器端我有一個生成像這樣上傳的URL處理程序:

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) 

我會期望當我點擊按鈕生成新的上傳url並在那裏發佈POST請求時,但是會發生什麼情況是表單的操作被延遲填充並且POST請求被完成爲錯誤的URL。我懷疑這可能是因爲我在做異步GET請求,我的形式在同一時間提交,但我不能完全肯定,因爲我在這裏看到類似的例子: http://blog.notdot.net/2010/04/Implementing-a-dropbox-service-with-the-Blobstore-API-part-3-Multiple-upload-support

+0

我看你使用'event.preventDefault()的提交事件;'應防止您的形式從在點擊提交按鈕時提交。你確定點擊事件被調用嗎? – Dola

+0

是的,'preventDefault()'是需要的,因爲我通過其他地方的文件上傳界面提交表單。 –

回答

1

兩件事情嘗試:

1)把$('#my-form').attr('action', uploadUrl);放在$.get()上面的成功回調中。 2)如果不起作用,則從$.get()切換到$.ajax(),並將async設置爲false。

-2

我解決了它通過更改$.get()$.ajax({async:false}),所以我想我不應該通過異步請求。

+0

這不是一個現實的解決方案。你真的應該__never__在網絡工作者之外使用同步的ajax請求。這樣做可以很容易地將UI線程鎖定一段明顯的時間。看看這裏提供的其他一些解決方案。 –

+0

有道理。謝謝。我回答得太快,沒有看到其他答案。 –

2

我不太喜歡在使用ajax時將async設置爲false。如果服務器沒有響應,它可以完全殺死你的頁面。

你可以嘗試綁定你的事件處理程序與表單提交事件,而不是按鈕單擊事件。並設置在Ajax調用的成功事件表單的action屬性,然後觸發形式

$('#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"); 
    }); 


});