2012-02-20 11 views
7

içinde Zip Dosyaları ve Deposu Oluşturun Bir zip dosyası oluşturmaya ve App Engine Blobstore'da depolamaya çalışıyorum. Şu anda Blobstore'dan geçerli bir zip dosyası almıyorum. Sorunun sıkıştırılması, saklanması, geri yüklenmesi veya indirilmesiyle ilgili olduğundan emin değilsiniz.GAE BlobStore

Aşağıdaki sorulardan kodları temel alarak kodu oluşturdum. Blobstore saklamadan sonra

  • Zipping dynamic files in App Engine (Python)
  • Is it possible to generate and return a ZIP file with App Engine?
    • , Kullanıcıların bir Matara uygulaması üzerinden indirmek sağlar.

      Yapmaya çalıştığım şeyin özü.

      def zipit(): 
          zipstream = StringIO.StringIO() 
          zfile = zipfile.ZipFile(file=zipstream, mode='w') 
          bytes = "lorem ipsum dolor sit amet" 
          zfile.writestr('loremipsum', bytes, compress_type=zipfile.ZIP_STORED) 
          zfile.close() 
          zipstream.seek(0) 
          return zipstream.getvalue() 
      
      
      zip_file = files.blobstore.create(mime_type='application/zip') 
      zip_data = zipit() 
      
      with files.open(zip_file, 'a') as f: 
          f.write(zip_data) 
      files.finalize(zip_file) 
      blob_key = files.blobstore.get_blob_key(zip_file) 
      
      blob_data = blobstore.BlobReader(blob_key).read() 
      
      # http://flask.pocoo.org/docs/api/ 
      response = make_response(blob_data) 
      response.headers['Content-Type'] = 'application/zip' 
      response.headers['Content-Disposition'] = 'attachment; filename="loremipsum.zip"' 
      return response 
      

      Herhangi bir yardım çok takdir edilmektedir.

    cevap

    6

    Kodunuzun çoğu, dev_appserver.py'deki bir webapp işleyicisinde çalışıyor. Aşağıdaki sürümüm, zip dosyasını doğrudan Blobstore'dan sunarak uygulama örneği RAM'ına okumaya ve sunmaya çalışıyor. Belki de istediğin bu mu? Aksi takdirde, Blobstore'da geçerli bir Zip dosyası oluşturduğuna inandığım için, kodunuzda değeri okuyup sunan bir sorun aramaya devam edin.

    #!/usr/bin/env python 
    
    import StringIO 
    import zipfile 
    from google.appengine.api import files 
    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 util 
    
    def zipit(): 
        zipstream = StringIO.StringIO() 
        zfile = zipfile.ZipFile(file=zipstream, mode='w') 
        bytes = "lorem ipsum dolor sit amet" 
        zfile.writestr('loremipsum', bytes, compress_type=zipfile.ZIP_STORED) 
        zfile.close() 
        zipstream.seek(0) 
        return zipstream.getvalue() 
    
    class MainHandler(blobstore_handlers.BlobstoreDownloadHandler): 
        def get(self): 
         k = self.request.get('key') 
         if k: 
          self.send_blob(k) 
          return 
    
         zip_file = files.blobstore.create(mime_type='application/zip') 
         zip_data = zipit() 
    
         with files.open(zip_file, 'a') as f: 
          f.write(zip_data) 
         files.finalize(zip_file) 
         blob_key = files.blobstore.get_blob_key(zip_file) 
    
         self.response.out.write('<a href="/getzip?key=%s">get zip</a>' % blob_key) 
    
    
    application = webapp.WSGIApplication([('/getzip', MainHandler)]) 
    
    def main(): 
        util.run_wsgi_app(application) 
    
    if __name__ == '__main__': 
        main() 
    
    +0

    Teşekkürler! Kodun çalışıyor. Muhtemelen alma sırasında bozuluyor. Program Flask üzerine kurulu ve bu yüzden dosyayı okuyup hizmet etmemin sebebi de bu. Send_blob'u denedim, ancak başlıkların kullanılabilir olmasını gerektirir. Bloğu dosyaya doğrudan Flask çerçevesinde sunmak için bazı geçici çözümler bulmam gerekecek. –

    +0

    Bu, URL'leri kimin ele alacağıyla ilgili bir sorun gibi görünüyor. Blobstore'daki resimler için get_serving_url var. Şişkodan, Flask'tan dosyalara nasıl hizmet verileceğini henüz öğrenmiyorum. –

    +0

    Başka bir adım. 'yanıt = make_response() ' ' response.headers [ 'X-AppEngine-BlobKey'] = blob_key' 'response.headers [ 'içerik türü'] = 'Uygulama/zip'' ' response.headers ['Content-Disposition'] = 'eki; filename = "loremipsum.zip" ' 'dönüş yanıtı' Ancak, bu hala orijinal sorunu çözmez! –