Domanda

Sto pensando di creare una web app che consente agli utenti di effettuare il downgrade file di progetto di visual studio.Tuttavia, sembra Che Google App Engine accetta file di caricamento e flat file archiviati sul Server di Google attraverso db.TextProperty e db.BlobProperty.

Sarò felice chiunque può fornire un esempio di codice (sia il client e lato server) su come questo può essere fatto.

È stato utile?

Soluzione

Qui è un completo, file di lavoro.Ho tirato l'originale dal sito di Google, e modificato per renderlo leggermente più reale del mondo.

Un paio di cose da notare:

  1. Questo codice utilizza l' BlobStore API
  2. Lo scopo di questa linea in ServeHandler classe è quello di "fissare" il chiave, in modo che si libera di qualsiasi nome alterazione che potrebbe essersi verificato in il browser (non osservare qualsiasi in Chrome)

    blob_key = str(urllib.unquote(blob_key))
    
  3. Il "save_as" clausola alla fine questo è importante.Si farà in modo che il nome del file non storpiati quando viene inviato al vostro browser.Sbarazzarsi di esso a osservare ciò che accade.

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

Buona Fortuna!

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()

Altri suggerimenti

Infatti, a questa domanda risponde l'App Egnine documentazione.Vedere un esempio Il Caricamento Di Immagini Dell'Utente.

Il codice HTML, all'interno <form></form>:

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

Codice 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('/')

C'è un thread in Google Gruppi su di esso:

Il Caricamento Dei File

Con un sacco di codice utile, questa discussione mi ha aiutato molto nel caricamento dei file.

Google ha rilasciato un servizio per l'archiviazione di file di grandi dimensioni.Guarda blobstore documentazione delle API.Se i tuoi file sono > 1MB, si dovrebbe utilizzare.

L'ho provato oggi, funziona come segue:

la mia versione dell'sdk 1.3.x

pagina html:

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

Il Codice Del Server:

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

Se il problema persiste, verificare che si sta utilizzando enctype nel tag form

No:

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

Sì:

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

È possibile memorizzare i file dato che non è un tradizionale file di sistema.È possibile memorizzare solo nel loro Archivio (in un campo definito come un BlobProperty)

C'è un esempio nel precedente link:

class MyModel(db.Model):
  blob = db.BlobProperty()

obj = MyModel()
obj.blob = db.Blob( file_contents )

Personalmente ho trovato il tutorial descritto qui utile quando si utilizza il Java runtime con GAE.Per qualche ragione, quando ho provato a caricare un file utilizzando

<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>

Ho scoperto che la mia classe HttpServlet per qualche motivo non accettare la forma con la 'enctype' attributo.Rimozione opere, tuttavia, questo significa che non è possibile caricare qualsiasi file.

Non c'è nessun file flat memorizzazione in Google App Engine.Tutto deve passare per il Datastore che è un po ' come un database relazionale, ma non abbastanza.

È possibile memorizzare i file come TextProperty o BlobProperty attributi.

C'è un limite di 1MB sul DataStore voci che possono o non possono essere un problema.

Ho notato qualche comportamento strano durante il caricamento di file su App Engine.Quando si invia il seguente modulo:

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

E poi si estrae il img dalla richiesta di simile a questo:

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

Il img_contents la variabile è un str() in Google Chrome, ma è unicode in Firefox.E, come ora, il db.Blob() il costruttore accetta una stringa e verrà generato un errore se si passa una stringa unicode.

Qualcuno sa come questo può essere risolto?

Inoltre, quello che trovo assolutamente strano è che quando ho copiare e incollare il Guestbook applicazione (con avatar), funziona perfettamente.Faccio tutto esattamente allo stesso modo nel mio codice, ma non funziona.Io sono molto vicino alla tirando i capelli fuori.

C'è un modo di utilizzare flat file di sistema( Almeno in prospettiva di utilizzo)

C'è questo Google App Engine Virtual FileSystem progetto.che è attuato con l'aiuto di archivio dati e memcache Api per emulare un normale filesystem.Utilizzando questa libreria è possibile utilizzare nel vostro progetto in un simili accesso al filesystem(lettura e scrittura).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top