首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Appengine serve gzipped文件

Appengine serve gzipped文件
EN

Stack Overflow用户
提问于 2012-02-04 02:02:27
回答 1查看 613关注 0票数 1

我正在使用AppEngine在我的应用程序中存储一些酸洗过的python对象。我希望将这些文件直接提供给用户,并且我只是使用X-AppEngine-Blobkey头向具有file.pickle.gz文件名的用户提供这些文件。但是,当我试图在我的计算机(Mac )上使用简单的双击解压这些文件时,这些文件被转换为file.pickle.gz.cpgz

我以为是我的浏览器偷偷摸摸地提取它们,但我不这么认为,因为

代码语言:javascript
复制
pickle.load('file.pickle.gz')

不管用,也不管用

代码语言:javascript
复制
pickle.load('file.pickle.gz.cpgz') 

为了存储这些文件,我使用:

代码语言:javascript
复制
    blobfile = files.blobstore.create(mime_type='application/gzip')
    with files.open(blobfile, 'a') as f:
        gz = gzip.GzipFile(fileobj=f,mode='wb')
        gz.write(my_pickled_object)
        gz.close()
    files.finalize(blobfile)

我想我不理解gzip的工作方式。有人能解释一下吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-04 09:02:10

您确定file.pickle.gz.cpgz是双击下载的file.pickle.gz文件的结果吗?通常,".cpgz“是一种不同的归档文件。

我可以让您发布的代码在开发服务器中工作,而无需进行重大更改。以下是代码,如果它有帮助的话:

代码语言:javascript
复制
#!/usr/bin/env python

from __future__ import with_statement
import gzip
import pickle
from google.appengine.api import files
from google.appengine.api import memcache
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

class MainHandler(webapp.RequestHandler):
    def get(self):
        self.response.out.write('Hello world! <a href="/make">make</a> <a href="/get">get</a>')

class MakeFileHandler(webapp.RequestHandler):
    def get(self):
        data = pickle.dumps({'a':1, 'b':True, 'c':None})

        blobfile = files.blobstore.create(mime_type='application/gzip')
        with files.open(blobfile, 'a') as f:
            gz = gzip.GzipFile(fileobj=f,mode='wb')
            gz.write(data)
            gz.close()
        files.finalize(blobfile)
        memcache.set('filekey', files.blobstore.get_blob_key(blobfile))
        self.redirect('/')

class GetFileHandler(blobstore_handlers.BlobstoreDownloadHandler):
    def get(self):
        blobkey = memcache.get('filekey')
        if blobkey:
            self.send_blob(blobkey)
        else:
            self.response.out.write('No data key set <a href="/">back</a>')

def main():
    application = webapp.WSGIApplication([('/', MainHandler),
                                          ('/make', MakeFileHandler),
                                          ('/get', GetFileHandler)],
                                         debug=True)
    util.run_wsgi_app(application)

if __name__ == '__main__':
    main()

点击"make",然后点击"get“。一个名为"get.gz“的文件被下载到你的~/Downloads/文件夹中(至少在Chrome中是这样)。双击它以产生一个名为"get“的文件。然后:

代码语言:javascript
复制
% python
>>> import pickle
>>> pickle.load(open('get'))
{'a': 1, 'c': None, 'b': True}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9133278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档