78 votes

Télécharger des fichiers dans Google App Engine

J'ai l'intention de créer une application web qui permet aux utilisateurs de revoir à la baisse leurs fichiers de projets visual studio. Cependant, Il semble que Google App Engine accepte les fichiers de téléchargement et le fichier plat stockage sur le Serveur de Google par le biais de db.TextProperty et db.BlobProperty.

Je serai heureux n'importe qui peut fournir le code de l'échantillon ( à la fois le client et côté serveur) sur la façon dont cela peut être fait, merci

49voto

sastanin Points 16061

En fait, cette question est résolue dans l'App Egnine de la documentation. Voir un exemple sur la Téléchargeant des Images.

Code HTML, à l'intérieur de la balise <form></form>:

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

Le code Python:

classe livre d'or(webapp.RequestHandler):
 def post(self):
 salut = message d'accueil)
 si les utilisateurs.get_current_user():
 salut.auteur = utilisateurs.get_current_user()
 salut.contenu = auto.demande.get("contenu")
 avatar = auto.demande.get("img")
 salut.avatar = db.Blob(avatar)
salut.put()
 auto.redirect('/')

43voto

010110110101 Points 2240

Voici une complète, fichier de travail. J'ai tiré de l'original à partir du site Google et l'a modifié pour le rendre un peu plus du monde réel.

Quelques choses à noter:

  1. Ce code utilise le BlobStore API
  2. Le but de cette ligne dans le ServeHandler classe est de "fixer" l' clé, de sorte qu'il se débarrasse de tout nom une déformation qui peut avoir eu lieu dans le navigateur (je n'ai pas d'observer tout en Chrome)

    blob_key = str(urllib.unquote(blob_key))
    
  3. Le "save_as" clause à la fin de ce qui est important. Il fera en sorte que le nom de fichier ne se déchire lorsqu'il est envoyé à votre navigateur. Se débarrasser de lui pour observer ce qui se passe.

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

Bonne Chance!

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="http://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()

6voto

jbochi Points 12280

Google a publié un service de stockage de fichiers volumineux. Jetez un oeil à blobstore documentation de l'API. Si vos fichiers sont > 1 MO, vous devriez l'utiliser.

6voto

Bili Points 79

Je l'ai essayer aujourd'hui, Il fonctionne comme suit:

mon sdk version 1.3.x

page html:

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

Code Serveur:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X