生成Zip文件并存储在GAE BlobStore

7

我正在尝试生成一个zip文件并将其存储在App Engine的Blobstore中,但目前从Blobstore中无法得到有效的zip文件。不确定问题是压缩、存储、检索还是下载方面的。

我已经根据以下问题的片段构建了代码。

在Blobstore中存储后,我通过Flask应用程序让用户进行下载。

下面是我尝试做的要点。

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

非常感谢任何帮助。

1个回答

6

大部分你的代码在dev_appserver.py中的Web应用程序处理程序中可以正常工作。下面是我的版本,它直接从Blobstore中提供zip文件,而不是尝试将其读入应用实例RAM并提供它。也许这就是你想要的?如果不是,请继续查找读取和提供值的代码中的问题,因为我相信你正在Blobstore中创建一个有效的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()

谢谢!你的代码有效。可能是在检索过程中出现了损坏。该程序基于Flask构建,这就是为什么我读取文件并提供服务的原因。我尝试使用send_blob,但它需要可用的标头。我将不得不找到一些解决方案,通过Flask框架直接提供blob文件。 - Geordee Naliyath
看起来这是一个谁来处理URL的问题。对于Blobstore中的图像,有get_serving_url。我还没有找到如何通过Flask从Blobstore提供文件的方法。 - Geordee Naliyath
тЈдСИђСИфТГЦжфцсђѓresponse = make_response() response.headers['X-AppEngine-BlobKey'] = blob_key response.headers['Content-Type'] = 'application/zip' response.headers['Content-Disposition'] = 'attachment; filename="loremipsum.zip"' return responseСйєУ┐ЎС╗ЇуёХТ▓АТюЅУДБтє│тјЪтДІжЌ«жбў№╝Ђ - Geordee Naliyath

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接