Ich habe eine AppEngine-Anwendung, die den Blobstore verwendet, um von Benutzern bereitgestellte Bilddaten zu speichern. Wenn ich Bilder von einem Formular in Chrome in diese Anwendung hochlade, funktioniert es einwandfrei. Wenn ich versuche, ein Bild von einer Android-Anwendung hochzuladen, schlägt es fehl. Beide Methoden funktionieren gut, wenn ich gegen den Entwicklungsserver aktiv bin, aber der Android-Upload funktioniert nicht gegen den Live-Dienst.AppEngine BlobStore Upload fehlgeschlagen mit einer Anfrage, die in der Entwicklungsumgebung funktioniert
Dies ist die Anfrage von Chrome:
POST /_ah/upload/?userToken=11001/AMmfu6ZCyMQQ9YdiXal3SmSXIRTQIuSRXkNc-i3JmU0fqx_kJbUJ2OMLcS2lXhVJSK4qs7regViTKzOPz5ejoZYi0nAD5o8vNltiOViQw6DZO7_byZz3Ut0/ALBNUaYAAAAAS_lusgPMAGmpPrg0BuNsJyymX-57ob4i/ HTTP/1.1
Host: photohuntservice.appspot.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.1.249.1064 Safari/532.5
Referer: http://photohuntservice.appspot.com/debug_newpuzzle?userToken=11001
Content-Length: 60360
Cache-Control: max-age=0
Origin: http://photohuntservice.appspot.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarybl05YLmLbFRf2MzN
Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
------WebKitFormBoundarybl05YLmLbFRf2MzN
Content-Disposition: form-data; name="userToken"
11001
------WebKitFormBoundarybl05YLmLbFRf2MzN
Content-Disposition: form-data; name="img"; filename="Photo_020908_001.jpg"
Content-Type: image/jpeg
<image data>
------WebKitFormBoundarybl05YLmLbFRf2MzN
Content-Disposition: form-data; name="longitude"
-122.084095
------WebKitFormBoundarybl05YLmLbFRf2MzN
Content-Disposition: form-data; name="latitude"
37.422006
------WebKitFormBoundarybl05YLmLbFRf2MzN--
Dies ist der Wunsch von meinem Client (die in Java auf Android geschrieben, aber ich glaube nicht, das ist relevant):
POST /_ah/upload/?userToken=11001/AMmfu6Zf9an6AU4lT9UuhIpxOZyOYb1LMwimFpeSh8zr6J1sX9F2ddJW3Qlsw0kwV3oALv-TNPWRQ6g4_Dgwk0UTwF47bbc78Yl44kDeV69MydTuR3N46S4/ALBNUaYAAAAAS_mMr3CYqTg3aVBDjhRxP0DyyRdvotyG/ HTTP/1.1
Content-Type: multipart/form-data;boundary=----WebKitFormBoundaryhdyNAhmOouRDGErG
Cache-Control: max-age=0
Accept: */*
Origin: http://photohuntservice.appspot.com
Connection: keep-alive
Referer: http://photohuntservice.appspot.com/getuploadurl?userToken=11001
Content-Length: 2638
Host: photohuntservice.appspot.com
User-Agent: Apache-HttpClient/UNAVAILABLE (java 1.4)
Expect: 100-Continue
------WebKitFormBoundaryhdyNAhmOouRDGErG
Content-Disposition: form-data; name="userToken"
11001
------WebKitFormBoundaryhdyNAhmOouRDGErG
Content-Disposition: form-data; name="img";filename="PhotoHunt.jpg"
Content-Type: image/jpeg
<image data>
------WebKitFormBoundaryhdyNAhmOouRDGErG
Content-Disposition: form-data; name="latitude"
37.422006
------WebKitFormBoundaryhdyNAhmOouRDGErG
Content-Disposition: form-data; name="longitude"
-122.084095
------WebKitFormBoundaryhdyNAhmOouRDGErG--
In beiden Fällen ist die App Engine Python Code, um die Anfrage zu fangen ist das gleiche:
class UploadPuzzle(blobstore_handlers.BlobstoreUploadHandler):
def post(self):
upload_files = self.get_uploads()
die probl em bedeutet, dass self.get_uploads() beim Ausführen des Produktions-AppEngine-Dienstes eine leere Liste zurückgibt, wenn die Anfrage über meine Client-App erfolgt. Beide Anfragen geben auf dem Entwicklungsserver das wieder, was ich erwarte (eine Liste mit einem blob_info), und Chrome gibt in beiden Fällen das wieder, was ich erwarte.
Gute Erkennungsarbeit! Kannst du bitte einen Fehler dafür einreichen? –
Bereits getan: http://code.google.com/p/googleappengine/issues/detail?id=3273 –
That @ # $%! Produktionsserver. "Sicherlich ist der Platz vor dem Dateinamen überflüssig, lass mich aufräumen", dachte ich. Oh, der Preis, den ich für meine Ordentlichkeit bezahlt habe. – drcode