2010-05-23 21 views
5

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.

Respuesta

11

Resulta que el problema era la siguiente línea:

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

Se debería leer la siguiente manera:

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

El analizador de forma de datos en servidores de producción es más estricta que la de la entorno de desarrollo y requiere un espacio entre el punto y coma y "filename ="

+1

¡Buen trabajo de detección! ¿Puedes archivar un error para eso, por favor? –

+2

Ya lo hizo: http://code.google.com/p/googleappengine/issues/detail?id=3273 –

+1

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

-1

Otra opción podría ser porque ha agregado parámetros de URL, que funciona normalmente, pero no con La forma en que Blobstore uploader redirige a su servlet.

Cuestiones relacionadas