Estoy planeando crear una aplicación web que permita a los usuarios degradar sus archivos de proyecto de Visual Studio. Sin embargo, parece que Google App Engine acepta la carga de archivos y el almacenamiento de archivos planos en el servidor de Google a través de db.TextProperty
y db.BlobProperty
.
Me alegrará que alguien pueda proporcionar una muestra de código (tanto del lado del cliente como del servidor) sobre cómo se puede hacer esto.
python
google-app-engine
Graviton
fuente
fuente
Respuestas:
Aquí hay un archivo completo y funcional. Saqué el original del sitio de Google y lo modifiqué para hacerlo un poco más real.
Algunas cosas a tener en cuenta:
El propósito de esta línea en la clase ServeHandler es "arreglar" la clave para que se deshaga de cualquier alteración de nombres que pueda haber ocurrido en el navegador (no observé ninguna en Chrome)
blob_key = str(urllib.unquote(blob_key))
La cláusula "save_as" al final de esto es importante. Se asegurará de que el nombre del archivo no se altere cuando se envíe a su navegador. Deshazte de él para observar qué pasa.
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="https://stackoverflow.com/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()
fuente
self.__uploads
enblobstore_handler
esNone
cuando intento esto.De hecho, esta pregunta se responde en la documentación de App Egnine. Vea un ejemplo sobre la carga de imágenes de usuario .
Código HTML, dentro de <form> </form>:
Código Python:
fuente
Hay un hilo en Grupos de Google al respecto:
Carga de archivos
Con mucho código útil, esa discusión me ayudó mucho a subir archivos.
fuente
Google ha lanzado un servicio para almacenar archivos grandes. Eche un vistazo a la documentación de la API de blobstore . Si sus archivos tienen más de 1 MB, debe usarlos.
fuente
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()
fuente
Si sigues teniendo problemas, comprueba que estás usando enctype en la etiqueta del formulario.
No:
<form encoding="multipart/form-data" action="/upload">
Si:
<form enctype="multipart/form-data" action="/upload">
fuente
No puede almacenar archivos porque no existe un sistema de archivos tradicional. Solo puede almacenarlos en su propio 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 )
fuente
Personalmente, el tutorial que se describe aquí me resultó útil cuando se usa el tiempo de ejecución de Java con GAE. Por alguna razón, cuando intenté cargar 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 aceptaba el formulario con el atributo 'enctype'. Eliminarlo funciona, sin embargo, esto significa que no puedo cargar ningún archivo.
fuente
No hay almacenamiento de archivos planos en Google App Engine. Todo tiene que ir al almacén de datos, 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 del almacén de datos que pueden ser un problema o no.
fuente
He observado un comportamiento extraño al cargar archivos en App Engine. Cuando envía 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
img_contents
variable es unastr()
en Google Chrome, pero es unicode en Firefox. Y como ahora, eldb.Blob()
constructor toma una cadena y arrojará 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 funcionará. Estoy muy cerca de arrancarme el pelo.
fuente
Hay una forma de usar el sistema de archivos planos (al menos en perspectiva de uso)
Existe este proyecto de sistema de archivos virtual de Google App Engine . que se implementa con la ayuda del almacén de datos y las API de Memcache para emular un sistema de archivos normal. Usando esta biblioteca, puede usar en su proyecto un acceso al sistema de archivos similar (lectura y escritura) .
fuente