2010-06-20 24 views
16

AjaxForm dosya yükleme ve uygulama motoru blobstore ile ilgili bazı sorunlar yaşıyorum. Zorluktan şüpheleniyorum çünkü blobstore yükleme işleyicisi (blobstore_handlers.BlobstoreUploadHandler alt sınıfı) herhangi bir içeriği döndürmek yerine bir yönlendirme yanıtı gerektiriyor, ancak emin değilim. Çalışmak için bir XML belgesi almayı umuyorum ve tarayıcıya beklendiği gibi geliyormuş gibi görünüyorum, ancak aşağıdaki ayrıntıları elde edemiyorum.AjaxForm ve uygulama motoru 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) 

nihai yönlendirme bir xml belgesini döndüren benim uygulamasında bir uri etmektir - aşağıdaki gibi

Uygulamam motor Blobstore yükleme işleyicisi olduğunu. Sunucu çıktısına bakıldığında, herhangi bir şeyin yanlış olduğuna dair bir işaret yoktur - yönlendirme hizmeti verilir ve doğru mime türüyle xml belgesini beklendiği gibi döndürür - bu nedenle form gönderimi iyi görünür ve bu gönderim için sunucu yanıtı görünüyor iyi.

şöyle ajaxForm görünüyor kullanarak Müvekkilim tarafı kodu (üzgünüm onun biraz geniş, ben sorun olsa burada sanmıyorum) -

// 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)); 
     } 
     }); 
    }); 

ben formdaki 'eylemi' set (ve etkinleştirme sonradan düğmesi) -

$.get('/blob_upload_url', function(data) { 
    dialogForm.attr("action", data); 
    $("input[type=button]", dialogForm[0]).attr("value", "Upload").button("option", "disabled", false); 
}; 

orada hem giriş için biraz google kapak yardımıyla ve nesneleri açığa ediyorum. Her şey iyi görünüyor - beklendiği gibi sunucuya doğru bir şekilde gönderiyor ve başarı işlevi deniyor. Chrome dev araçlarında belge yapısını izlersem, dosya yükleme ve yanıtını işlemek için kısaca oluşturulan iFrame'i görebiliyorum. Sorun şu ki, cevapta xml belgesini asla alamıyorum.

[ 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] 

mim türü hakkında krom şikayet muhtemelen süper alakalı, ama bağlantı :) asmıyorum - - aşağıdaki şekilde ölçüm değeridir en azından en xml belgesini getirmesi anlamına geliyor bir nokta. Krom kaynakları görünümünde, POST görebilir ve tepki daha sonra 302 yönlendirme ve sonraki GET isteği olduğunu - başlık iyi görünüyor -

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 

Krom kaynaklar görünümü beni göstermez Bu belgenin içeriği (sadece boş) ancak firefox yok ve xml belgesi iyi görünüyor. Firefox aynı sonucu verir, ancak - ajaxSubmit() responseText için null.

Sadece bir yerlerde bir beyin fade ettiğimi anladım, ama gerçekten beni güldürdü. Herhangi harika olacağını xml belgesini almak için işaretçileri - şerefe,

Colin

+0

Ajaxform'un yönlendirme işlemlerini tek başına ya da kendileriyle ilgilenmeyen bir flash bileşeni kullandığı için doğru şekilde işlemediğini tahmin ediyorum. Yükleme işleyicinizi normal bir istek işleyicisine dönüştürmeyi ve doğrudan bir yönlendirme yerine belgeyi iade etmeyi deneyin ve bunun herhangi bir fark yaratıp yaratmadığını görün - bu en azından yönlendirmenin olup olmadığını size söyleyecektir. –

+0

Evet - önerilen şekilde yönlendirildiğini doğruladı (flaş kullanmıyor). Blogu mağazası UploadHandler bir yönlendirmeyi nasıl yönetiyor? Blobstore ile çalışan herkesin ajax stili yüklemesi var mı? yani kullanıcı yönlendirme veya sayfa yenilemeyi yaşamıyor mu? Teşekkürler. – hawkett

+0

http://forum.jquery.com/topic/jquery-form-plugin-and-app-engine-blobstore#14737000001093602 - yönlendirmeyi takip edemediğini onaylayan yazar. * Zorlanmış * yönlendirme davranışının blobstore API'sı ile aşırı şekilde dolu olduğu görünüyor mu? – hawkett

cevap

0

aynı sorun takılıp 5 ay ise .. Burada sormak gerektiğini düşünüyorum:

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

+0

Bu sorun neredeyse kesinlikle bir krom problemi değil - diğer tarayıcılarda da ortaya çıkıyor. Sorun, buna nasıl baktığınıza bağlı olarak, bir yönlendirmeyi bildiren blobstore api veya bu yönlendirmeyi izlemeyen AjaxForm'dur. Google'dan herhangi bir haklı yokluğun yokluğunda, eskilere doğru eğilmem - hiçbir sebepten ötürü zıplamak için bir çember oluşturmuşlar gibi görünüyor. – hawkett

4

İşte ben biraz değiştirilmiş kullandığım (sadece Chrome'da test edilmiş) bir yöntem. AjaxForm değil ama işe yarıyor.

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 sunucusunda bir param olarak kullanılabilir. 'Files' parametresi, dosya tipi giriş formu elemanının 'files' özelliğinden gelir (çoklu desteği desteklemek için bir dizi olarak).'Progress_callback' parametresi, (en azından) 'yüklü' ve 'toplam' alan (birim bayt) olan bir nesneyi alan bir işlevdir. Sunucu yanıtını umursamıyor.

+0

Tamam, yanıtı beklemek yerine, yüklemenin ne zaman tamamlandığını (yüklenen == toplam?) Saptamak için ilerleme geri bildirimini kullanın ve sonra da güncellenmiş öğeyi ayrı ayrı sorgulayın - söylediğiniz gibi, sunucu yanıtını tamamen yoksayın mı? Ta. – hawkett

1

Burada nasıl çözdüğümü bulabilirsiniz. Dosya ile birlikte javascript gönderisinde rastgele bir id ekledim. Yükleme tamamlandıktan sonra sunucumu bir süre için bu rastgele kimliği ve karşıya yüklenen dosyayı ilişkilendirmeyi hatırlayacak şekilde yapılandırın. Dosyanın yeni yüklenmesini istemek için mysite.com/blobdata/that_random_id_i_renerated gibi bir öntanımlı URL'ye başka bir sorgu gönderiyorum. işe yaradı.

İlgili konular