Tengo una aplicación de App Engine que usa el almacén de blob para almacenar los datos de imagen proporcionados por el usuario. Cuando cargo imágenes en esa aplicación desde un formulario en Chrome, funciona bien. Cuando intento subir una imagen desde una aplicación de Android, falla. Ambos métodos funcionan bien si estoy corriendo contra el servidor de desarrollo, pero la carga de Android no funciona en contra del servicio en vivo.Error de carga de AppEngine BlobStore con una solicitud que funciona en el Entorno de desarrollo
Esta es la solicitud de 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--
Ésta es la petición de mi cliente (que está escrito en Java en Android, pero no creo que eso es relevante):
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--
En ambos casos, el código Python de App Engine para capturar la solicitud es el mismo:
class UploadPuzzle(blobstore_handlers.BlobstoreUploadHandler):
def post(self):
upload_files = self.get_uploads()
el probl es que cuando se ejecuta en el servicio de producción de AppEngine self.get_uploads() devuelve una lista vacía cuando la solicitud se realiza desde mi aplicación cliente. Ambas solicitudes devuelven lo que esperaba (una lista con un blob_info) en el servidor de desarrollo, y Chrome devuelve lo que espero en ambos casos.
¡Buen trabajo de detección! ¿Puedes archivar un error para eso, por favor? –
Ya lo hizo: http://code.google.com/p/googleappengine/issues/detail?id=3273 –
That @ # $%! servidor de producción "Seguramente ese espacio antes del nombre de archivo es superfluo, déjenme limpiarlo", pensé. Oh, el precio que pagué por mi limpieza. – drcode