2014-12-03 18 views
6

Tuhaf bir hatayla karşılaşma.Google Storage API - Devam Edilebilir Yükleme, AJAX, CORS Hatası

Bir kullanıcı bir dosyayı yüklemek istediğinde, sunucuma bir AJAX isteği gönderir. Sunucum, OAuth2 ile sunucu tarafını Google'ın sunucularına doğrular, bir erişim belirteci oluşturur, devam eden bir yükleme başlatır ve tekrar yüklenebilen yükleme URI'sı ile erişim belirtecini tarayıcıya geçirir. Daha sonra tarayıcı doğrudan Google Depolama Alanı’na yüklenir. Daha sonra, tarayıcı doğrudan Google Depolama Alanı’na yüklenir.

Her şey iyi görünüyor. Dosya Depolama Kovası'na sorun değil, ancak Chrome'da hala bir CORS hatası alıyorum ve neden ya da neden olduğundan emin değilim. İşte benim javascript kodu basitleştirilmiş bir versiyonudur:

var file = document.getElementById("fileInput").files[0]; 

var request = requestUpload(); 
var token = request.token; 
var uri = request.uri; 

var r = new XMLHttpRequest(); 
r.open('PUT', uri, true); 
r.setRequestHeader("Authorization", "Bearer "+token); 
r.send(file);` 

Oldukça basit-ama hala bu ortak hatayı alıyorum:

XMLHttpRequest cannot load https://www.googleapis.com/upload/storage/v1/b/*****. No 'Access-Control-Allow-Origin' header is present on the requested resource.

tamamen işlevsel olarak görünüyor rağmen. Javascript bazı varsayılanlar tarafından izin verilmediğini görmek istiyor mu? Hatalar istemem.

XMLHttpRequest nesnesi, her şey tamamlandıktan sonra bir hata olayını da tetikler. Talebin, Google’ın elde edemediği bir tür geri bildirim beklediğini ve JavaScript’in JavaScript’in Latin’i haline geldiğini tahmin ediyorum. Bu yüzden, jQuery’le ilgili yaptığım tartışmaların çoğu.

Çok teşekkürler!

cevap

4

Sadece bu kesin soruna rastladım. Kafamı biraz tırmalamıştım ama bir çözüm buldum. Oldukça kötü belgelenmiştir ve davranış tam olarak mantıklı değil ama bu sayfadaki son madde işareti noktasında bakarsak

https://cloud.google.com/storage/docs/cross-origin

When using the resumable upload protocol, the Origin from the first (start upload) request is always used to decide the Access-Control-Allow-Origin header in the response, even if you use a different Origin for subsequent request. Therefore, you should either use the same origin for the first and subsequent requests, or if the first request has a different origin than subsequent requests, use the XML API with the CORS configuration set to *.

Yani ne yaptığını ben Origin: http://example.com isteği eklendi oldu Sunucudan devam eden oturum başlatma isteği üstbilgisi. Bu şekilde, bu yükleme oturumu kimliğine karşılık gelen tüm müşteri istekleri, o kaynağa karşı kontrol edecektir.

Hala tuhaf bulduğum bir şey, tarayıcı tarafından yapılan OPTIONS ön kontrol isteğidir (en azından benim için), PUT isteğinin başarısız olmasına rağmen bir şey olmasına izin veriyordu. Hatta bu yapılandırmayla

+0

Merhaba @ Craig, son yığınta bu sorun var mı? Eğer yaptıysanız, bunu nasıl çözdünüz ?: http://stackoverflow.com/questions/34832640/google-storage-doesnt-send-cors-headers-for-final-chunk-in-resumable-upload – janesconference

1

gsutil cors get gs://your-bucket yürütme, sen @Craig 'ın cevaba göre ilk POST isteği başlatmak gerekir:

[{"maxAgeSeconds": 3600, "method": ["GET", "PUT", "POST", "HEAD", "DELETE"], "origin": ["*"], "responseHeader": ["*"]}].

Örneğin golang kullanarak, gcloud isteğine Origin'u aktarmak kolaydır. r http.Request girişine sahip olmak için r.Header.Get("Origin") kodunu çalıştırabilir ve POST on gcloud işlevini çağıran bir işleve iletebilirsiniz. Bu, golang içinde yaptığım bir işlev: (