2009-05-09 20 views
15

Estoy intentando subir datos a Google App Engine (usando GWT). Estoy usando el widget FileUploader y el servlet usa un InputStream para leer los datos e insertarlos directamente en el almacén de datos. Al ejecutarlo localmente, puedo cargar archivos de gran tamaño con éxito, pero cuando lo despliego a GAE, estoy limitado por el tiempo de solicitud de 30 segundos. ¿Hay alguna forma de evitar esto? ¿O hay alguna forma de dividir el archivo en fragmentos más pequeños y enviar los fragmentos más pequeños?Google App Engine Carga de archivo grande

Respuesta

1

tendrías que cargarlo en otro servidor; creo que el tiempo de espera de 30 segundos no se puede evitar. Si hay una manera, por favor corrígeme! Me encantaría saber cómo!

+0

Eso es lo que me temía. Supongo que no es tan malo ... Podría usar Amazon S3 para el almacenamiento. Supongo que eso simplificaría la parte de almacenamiento, pero sería bueno mantener todo en el mismo lugar. – user103920

8

Actualmente, GAE impone un límite de 10 MB en la carga de archivos (y el tamaño de la respuesta), así como límites de 1 MB en muchas otras cosas; por lo tanto, incluso si tuviera una conexión de red lo suficientemente rápida como para aumentar más de 10 MB en una ventana de 30 segundos, eso sería en vano. Google ha dicho (escuché a Guido van Rossum mencionar que ayer aquí en Pycon Italia Tre) que tiene planes para superar estas limitaciones en el futuro (al menos para los usuarios de GAE que pagan por uso para exceder las cuotas - no estoy seguro si el los planes se extienden a los usuarios de GAE que no están pagando, y generalmente necesitan aceptar cuotas más pequeñas para obtener su uso gratuito de GAE).

+0

http://googleappengine.blogspot.com/2010/12/happy-holidays-from-app-engine-team-140.html – theosp

0

Lo más cercano que podría obtener sería dividirlo en fragmentos al almacenarlo en GAE y luego, cuando lo descargue, compilarlo emitiendo solicitudes AJAX por separado.

0

Estoy de acuerdo con dividir datos en blobs más pequeños y tengo dos tablas, una contiene los metadatos (nombre de archivo, tamaño, número de descargas, ... etc.) y otra contiene fragmentos, estos fragmentos están asociados a la tabla de metadatos por una clave foránea, creo que es factible ...

O cuando sube todos los trozos simplemente puede juntarlos en una sola mancha que tenga una tabla.

Pero el problema es que se necesita un cliente pesado para servir datos de fragmentación-, como un applet de Java, que debe ser firmado y la confianza de sus clientes para que pueda acceder al sistema de archivos local de

0

Si su solicitud se está quedando sin tiempo de solicitud, hay poco que puede hacer. Tal vez sus archivos sean demasiado grandes y tendrá que dividirlos en el cliente (con algo como Flash o Java o un marco de carga como pupload).

Una vez que obtiene el archivo en la aplicación, hay otro problema: las limitaciones del almacén de datos. Aquí tienes dos opciones:

  • se puede utilizar el servicio de BlobStore que tiene muy buena API para manejar hasta 50megabytes grandes subidas

  • se puede usar algo como bigblobae que puede almacenar gotas de tamaño prácticamente ilimitado en el almacén de datos appengine regular

1

El límite de tiempo de respuesta de 30 segundos solo se aplica a la ejecución del código. Por lo tanto, la carga del archivo real como parte del cuerpo de la solicitud queda excluida de eso. El temporizador solo se iniciará una vez que el cliente haya enviado por completo la solicitud al servidor y su código comience a manejar la solicitud enviada. Por lo tanto, no importa cuán lenta sea la conexión de su cliente.

Uploading file on Google App Engine using Datastore and 30 sec response time limitation