2012-02-20 16 views
7

Zipファイルを生成してApp EngineのBlobstoreに保存しようとしています。今、私はBlobstoreから有効なzipファイルを取得しません。問題がジッパー、保管、検索またはダウンロードであるかどうかはわかりません。GAE BlobStoreにZipファイルを生成して保存する

以下の質問のスニペットに基づいてコードを作成しました。ブロブストアに格納した後

  • Zipping dynamic files in App Engine (Python)
  • Is it possible to generate and return a ZIP file with App Engine?
    • は、私は、ユーザーがフラスコのアプリケーションを介して、それをダウンロードしてみましょう。

      ここに私がしようとしていることの要点があります。

      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 
      

      何か助けていただければ幸いです。

    答えて

    6

    ほとんどのコードはdev_appserver.pyのwebappハンドラで動作します。私の下のバージョンでは、BlobstoreからZIPファイルを直接提供していますが、これをアプリインスタンスRAMに読み込んで提供しています。多分これはあなたが意図したものですか?そうでない場合は、ブロブストア内に有効なZipファイルを作成していると思われるので、値を読み込んで提供するコードの問題を探し続けます。

    #!/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

    ありがとうございました!あなたのコードは動作します。おそらく、検索中に破損している可能性があります。このプログラムはFlaskで構築されています。それが理由です。なぜファイルを読み込んで提供するのですか? send_blobを試しましたが、ヘッダーが必要です。 Flaskフレームワークを介して直接BLOBファイルを処理するための回避策を見つける必要があります。 –

    +0

    これは、誰がURLを処理するのが問題なようです。 blobstoreの画像にはget_serving_urlがあります。私はFlaskを通して、ブロブストアからファイルを提供する方法をまだ見つけていません。 –

    +0

    別の手順。 '応答= make_response()' ' response.headers [ 'X-AppEngineの-blobKeyに'] = blob_key' 'response.headers [ 'のContent-Type'] =「アプリケーション/ zip'' ' response.headers ['Content-Disposition'] = '添付ファイル。ファイル名= "loremipsum.zip" '' '返信応答' これで元の問題は解決しません。 –

    関連する問題