2012-03-26 4 views
0

i Zip-Dateien in das Blobstore in GAE erstellt, dann habe ich versucht, zu erhalten (Download), um diese Zip-Datei mit diesem Code:Send_blob in GAE

def send_blob(blob_key_or_info, content_type=None, save_as=None): 

    CONTENT_DISPOSITION_FORMAT = "attachment; filename=\"%s\"" 

    if isinstance(blob_key_or_info, blobstore.BlobInfo): 
     blob_key = blob_key_or_info.key() 
     blob_info = blob_key_or_info 
    else: 
     blob_key = blob_key_or_info 
     blob_info = None 
    if blob_info: 
     content_type = content_type or mime_type(blob_info.filename) 
     save_as = save_as or blob_info.filename 
     #print save_as 
    logging.debug(blob_info) 
    response = Response() 
    response.headers[blobstore.BLOB_KEY_HEADER] = str(blob_key) 
    if content_type: 
     if isinstance(content_type, unicode): 
      content_type = content_type.encode("utf-8") 
     response.headers["Content-Type"] = content_type 
    else: 
     del response.headers["Content-Type"] 

    def send_attachment(filename): 
     if isinstance(filename, unicode): 
      filename = filename.encode("utf-8") 
     response.headers["Content-Disposition"] = (\ 
      CONTENT_DISPOSITION_FORMAT % filename) 
    if save_as: 
     if isinstance(save_as, basestring): 
      send_attachment(save_as) 
     elif blob_info and save_as is True: 
      send_attachment(blob_info.filename) 
     else: 
      if not blob_info: 
       raise ValueError("Expected BlobInfo value for blob_key_or_info.") 
      else: 
       raise ValueError("Unexpected value for save_as") 
    return response 

und wenn ich nenne diese Funktion in der Haupt- und Druck Rückkehr Rückgabewert dieser Funktion (Antwort) i erhalten zum Beispiel: 200 OK Content-Length: 0 X-App Engine-BlobKey: C25nn_O04JT0r8kwHeabDw == Content-Type: application/zip Content-Disposition: attachment; filename = "test.zip" Aber die Frage, wie kann ich jetzt diese Antwort verwenden, um die Datei auf meinen PC zu bekommen (herunterladen)? Vielen Dank im Voraus.

Antwort

3

Sie müssen einen Blobstore-Download-Handler implementieren, um die Datei zu liefern. Zum Beispiel:

from google.appengine.ext.webapp import blobstore_handlers 

class ServeZip(blobstore_handlers.BlobstoreDownloadHandler): 
    def get(self): 
    blob_key = self.request.get('key') 
    if not blobstore.get(blob_key): 
     logging.info('blobstore.get(%s) failed' % blob_key) 
     self.error(404) 
     return 

    self.send_blob(blob_key) 
    return 

Dann auf dem Client würden Sie rufen: http://yourapp.appspot.com/servezip?key=<your_url_encoded_blob_key>

Für das obige Beispiel: http://yourapp.appspot.com/servezip?key=C25nn_O04JT0r8kwHeabDw%3D%3D

+0

gehen verwenden werden: Wenn ich diese Klasse Handler dann in separate Seite setzen Sie den Schlüssel zu übergeben , das Problem war: Status: 404 nicht gefunden Content-Type: text/html; charset = utf-8 Cache-Steuerung: no-cache Läuft ab: Fr, 01.01.1990 00:00:00 GMT Content-Length: 0, der Handler hat nicht ausgeführt. Haben Sie eine Idee zu diesem Problem? –

+0

Wird in Ihrem Protokoll der Fehler "blobstore.get (...) fehlgeschlagen" angezeigt? Wenn dies der Fall ist, haben Sie möglicherweise den falschen Schlüssel übergeben oder den URL nicht korrekt codiert. Falls nicht, haben Sie den Handler möglicherweise nicht ordnungsgemäß in Ihrer app.yaml hinzugefügt. –

2

Well Google bietet eine sehr gute api Blobstore Objekte zu verarbeiten, vor allem zwei Clsses genannt als BlobstoreDownloadHandler und BlobstoreUploadHandler.

Um Inhalte herunterzuladen, versuchen Sie, BlobstoreDownloadHandler zu verwenden und der folgende Code hilft Ihnen, das Konzept zu verstehen.

from google.appengine.ext.webapp import blobstore_handlers 
    from google.appengine.ext.blobstore import BlobKey 

    class VideoDownloadHelper(blobstore_handlers.BlobstoreDownloadHandler): 
     def get(self, blobkey): 
      blobKey = BlobKey(blobkey) 
      #content_type is optional and by default it is same as uploaded content's content-type. 
      self.send_blob(blobKey, content_type="image/jpeg") 

Und diese Methode kann wie

app = webapp2.WSGIApplication([(r'/download-video/([^\.]+)', VideoDownloadHandler)]) 

Für weitere lesen Sie können durch diese https://cloud.google.com/appengine/docs/python/blobstore/