Frage

Ich plane einen Web-App zu erstellen, die Benutzer ihre Visual Studio Projektdateien degradieren kann. Es scheint jedoch, Google App Engine Dateien Hochladen und Flat-File-Speicherung auf dem Google-Server durch db.TextProperty und db.BlobProperty akzeptiert.

werde ich froh sein, jemand Beispielcode zur Verfügung stellen kann (sowohl den Client als auch die Server-Seite), wie dies geschehen kann.

War es hilfreich?

Lösung

Dies ist die komplette, Arbeitsdatei. Ich zog das Original von der Google-Website und modifizierte es etwas mehr reale Welt zu machen.

Ein paar Dinge zu bemerken:

  1. Dieser Code verwendet die Blobstore API
  2. Der Zweck dieser Linie in der ServeHandler Klasse ist der „Fix“ Schlüssel, so dass es von einem beliebigen Namen loswird Mangeln, die in aufgetreten sein können der Browser (ich habe beobachten nicht in Chrome)

    blob_key = str(urllib.unquote(blob_key))
    
  3. Die „save_as“ Klausel am Ende das ist wichtig. Es stellt sicher, dass der Dateiname nicht verstümmelt wird, wenn es um Ihren Browser gesendet wird. Es loswerden zu beobachten, was passiert.

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

Good Luck!

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

Andere Tipps

In der Tat ist diese Frage in der Dokumentation App Egnine beantwortet. Sehen Sie ein Beispiel auf Hochladen von Benutzer Bilder .

HTML-Code, innerhalb von

:

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

Python-Code:

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

Es ist ein Thread in Google Groups darüber:

Hochladen von Dateien

Mit vielen nützlichen Code, dass die Diskussion half mir sehr viel in dem Hochladen von Dateien.

Google hat einen Dienst für die Speicherung großer Dateien freigegeben. Hier finden Sie aktuelle Blobstore API-Dokumentation . Wenn Ihre Dateien> 1MB, sollten Sie es verwenden.

Ich versuche es heute, Es funktioniert wie folgt:

meine sdk Version 1.3.x

HTML-Seite:

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

Server-Code:

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

Wenn Ihr immer noch ein Problem haben, versuchen Sie Sie enctype in Form-Tag mit

No:

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

Ja:

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

Sie können Dateien nicht speichern, da es kein traditionelles Dateisystem ist. Sie können speichern sie nur in ihrem eigenen Datastor (in einem Feld als definiert BlobProperty )

Es gibt ein Beispiel in diesem Link:

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

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

Ich persönlich fand das Tutorial beschrieben hier nützlich, wenn die Java-Laufzeit mit GAE verwenden. Aus irgendeinem Grund, wenn ich versucht, eine Datei mit

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

Ich fand, dass meine HttpServlet Klasse aus irgendeinem Grunde würde das Formular mit dem ‚enctype‘ Attribute nicht akzeptieren. Entfernt es funktioniert, bedeutet dies jedoch, ich keine Dateien hochladen kann.

Es gibt keine Flat-Datei in Google App Engine zu speichern. Alles muss in gehen, um die Datastor Das ist ein bisschen wie eine relationale Datenbank, sondern nicht ganz.

Sie können speichern die Dateien als Textproperty oder < a href = "http://code.google.com/appengine/docs/datastore/typesandpropertyclasses.html#BlobProperty" rel = "nofollow noreferrer"> BlobProperty Attribute.

Es gibt eine 1MB Grenze für Datastore-Einträge, die kein Problem sein, oder nicht.

Ich habe ein seltsames Verhalten beobachtet, wenn Dateien auf App Engine hochladen. Wenn Sie das folgende Formular aus:

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

Und dann extrahieren Sie die img aus der Anfrage wie folgt:

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

Die img_contents Variable ist ein str() in Google Chrome, aber es ist Unicode in Firefox. Und wie Sie jetzt nimmt der db.Blob() Konstruktor einen String und wirft einen Fehler, wenn Sie in einem Unicode-String übergeben.

Wer weiß, wie dieses Problem behoben werden kann?

Auch, was finde ich absolut seltsam ist, dass, wenn ich das Gästebuch Anwendung kopieren und einfügen (mit Avataren), es funktioniert perfekt. Ich mache alles genau die gleiche Art und Weise in meinem Code, aber es wird einfach nicht funktionieren. Ich bin sehr nah meine Haare zu ziehen.

Es gibt eine Möglichkeit der Verwendung von Flat-File-System (Atleast in Nutzungsperspektive)

Es gibt dieses Google App Engine virtuellen Dateisystem-Projekt . dass mit Hilfe von Datenspeichern und memcache APIs implementiert ein gewöhnliches Dateisystem zu emulieren. Bei Verwendung dieser Bibliothek können Sie verwenden, in Sie einen ähnlichen Dateisystemzugriff (lesen und schreiben) projizieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top