2010-05-23 22 views
5

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.

Antwort

11

Stellt sich das Problem diese Linie war aus:

Content-Disposition: form-data; name="img"; filename="PhotoHunt.jpg" 

Der Parser für Form-Daten auf dem Produktionsserver als die in der ist strenger:

Content-Disposition: form-data; name="img";filename="PhotoHunt.jpg" 

Es soll so lesen Entwicklungsumgebung und erfordert ein Leerzeichen zwischen dem Semikolon und "Dateiname ="

+1

Gute Erkennungsarbeit! Kannst du bitte einen Fehler dafür einreichen? –

+2

Bereits getan: http://code.google.com/p/googleappengine/issues/detail?id=3273 –

+1

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

-1

Eine andere Option könnte sein, weil Sie URL-Parameter hinzugefügt, die normal funktioniert, aber nicht mit th Blobstore-Uploader kann auf Ihr Servlet umgeleitet werden.

Verwandte Themen