world standard hello google for flexible engine docs app python google-app-engine

python - standard - Subir archivos en Google App Engine



google cloud sdk app engine (11)

Aquí hay un archivo completo y de trabajo. Saqué el original del sitio de Google y lo modifiqué para hacerlo un poco más real.

Algunas cosas para notar:

  1. Este código usa la API de BlobStore
  2. El propósito de esta línea en la clase ServeHandler es "arreglar" la clave para que se deshaga de cualquier cambio de nombre que pueda haber ocurrido en el navegador (no observé ninguno en Chrome)

    blob_key = str(urllib.unquote(blob_key))

  3. La cláusula "save_as" al final de esto es importante. Se asegurará de que el nombre del archivo no se destruya cuando se envía a su navegador. Deshazte de él para observar lo que sucede.

    self.send_blob(blobstore.BlobInfo.get(blob_key), save_as=True)

¡Buena suerte!

import os import urllib from google.appengine.ext import blobstore from google.appengine.ext import webapp from google.appengine.ext.webapp import blobstore_handlers from google.appengine.ext.webapp import template from google.appengine.ext.webapp.util import run_wsgi_app class MainHandler(webapp.RequestHandler): def get(self): upload_url = blobstore.create_upload_url(''/upload'') self.response.out.write(''<html><body>'') self.response.out.write(''<form action="%s" method="POST" enctype="multipart/form-data">'' % upload_url) self.response.out.write("""Upload File: <input type="file" name="file"><br> <input type="submit" name="submit" value="Submit"> </form></body></html>""") for b in blobstore.BlobInfo.all(): self.response.out.write(''<li><a href="/serve/%s'' % str(b.key()) + ''">'' + str(b.filename) + ''</a>'') class UploadHandler(blobstore_handlers.BlobstoreUploadHandler): def post(self): upload_files = self.get_uploads(''file'') blob_info = upload_files[0] self.redirect(''/'') class ServeHandler(blobstore_handlers.BlobstoreDownloadHandler): def get(self, blob_key): blob_key = str(urllib.unquote(blob_key)) if not blobstore.get(blob_key): self.error(404) else: self.send_blob(blobstore.BlobInfo.get(blob_key), save_as=True) def main(): application = webapp.WSGIApplication( [(''/'', MainHandler), (''/upload'', UploadHandler), (''/serve/([^/]+)?'', ServeHandler), ], debug=True) run_wsgi_app(application) if __name__ == ''__main__'': main()

Estoy planeando crear una aplicación web que permita a los usuarios degradar sus archivos visuales de proyectos de estudio. Sin embargo, parece que Google App Engine acepta la carga de archivos y el almacenamiento plano de archivos en el servidor de Google a través de db.TextProperty y db.BlobProperty .

Me alegrará que cualquiera pueda proporcionar ejemplos de código (tanto del lado del cliente como del servidor) sobre cómo se puede hacer esto.


De hecho, esta pregunta se responde en la documentación de App Egnine. Vea un ejemplo sobre Carga de imágenes de usuario .

Código HTML, dentro de <form> </ form>:

<input type="file" name="img"/>

Código de Python:

class Guestbook(webapp.RequestHandler): def post(self): greeting = Greeting() if users.get_current_user(): greeting.author = users.get_current_user() greeting.content = self.request.get("content") avatar = self.request.get("img") greeting.avatar = db.Blob(avatar) greeting.put() self.redirect(''/'')



Hay un hilo en Google Groups al respecto:

Cargando archivos

Con un montón de código útil, esa discusión me ayudó mucho a subir archivos.


Hay una forma de usar el sistema de archivos planos (al menos en la perspectiva de uso)

Existe este proyecto de Google App Engine Virtual FileSystem . que se implementa con la ayuda de las API de almacén de datos y Memcache para emular un sistema de archivos común. Usando esta biblioteca puede usar en proyectos un acceso similar al sistema de archivos (lectura y escritura) .


He observado un comportamiento extraño al cargar archivos en App Engine. Cuando envíe el siguiente formulario:

<form method="post" action="/upload" enctype="multipart/form-data"> <input type="file" name="img" /> ... </form>

Y luego extrae el img de la solicitud de esta manera:

img_contents = self.request.get(''img'')

La variable img_contents es un str() en Google Chrome, pero es unicode en Firefox. Y como ahora, el constructor db.Blob() toma una cadena y lanzará un error si pasa una cadena unicode.

¿Alguien sabe cómo se puede solucionar esto?

Además, lo que encuentro absolutamente extraño es que cuando copio y pego la aplicación Libro de Visitas (con avatares), funciona perfectamente. Hago todo exactamente de la misma manera en mi código, pero simplemente no funciona. Estoy muy cerca de sacarme el pelo.


Lo intento hoy. Funciona de la siguiente manera:

mi versión sdk es 1.3.x

página html:

<form enctype="multipart/form-data" action="/upload" method="post" > <input type="file" name="myfile" /> <input type="submit" /> </form>

Código del servidor:

file_contents = self.request.POST.get(''myfile'').file.read()


No hay almacenamiento de archivos planos en Google App Engine. Todo tiene que ir al Datastore que es un poco como una base de datos relacional, pero no del todo.

Puede almacenar los archivos como atributos TextProperty o BlobProperty .

Hay un límite de 1 MB en las entradas de DataStore que pueden ser un problema o no.


No puede almacenar archivos ya que no hay un sistema de archivos tradicional. Solo puede almacenarlos en su propia DataStore (en un campo definido como BlobProperty )

Hay un ejemplo en el enlace anterior:

class MyModel(db.Model): blob = db.BlobProperty() obj = MyModel() obj.blob = db.Blob( file_contents )


Personalmente, encontré el tutorial descrito here útil cuando uso el tiempo de ejecución de Java con GAE. Por alguna razón, cuando intenté subir un archivo usando

<form action="/testservelet" method="get" enctype="multipart/form-data"> <div> Myfile:<input type="file" name="file" size="50"/> </div> <div> <input type="submit" value="Upload file"> </div> </form>

Descubrí que mi clase HttpServlet por alguna razón no aceptaría el formulario con el atributo ''enctype''. Sin embargo, eliminarlo funciona, esto significa que no puedo cargar ningún archivo.


Si todavía tiene un problema, verifique que esté usando enctype en la etiqueta del formulario

No:

<form encoding="multipart/form-data" action="/upload">

Sí:

<form enctype="multipart/form-data" action="/upload">