从GAE中的blobstore获取(服务)文件

时间:2012-03-26 21:33:34

标签: python google-app-engine blobstore

我参与了小项目;该项目的主要功能如下:

1 - 从用户的PC上传文件(使用HTML上的文件上传(表单提交))

2 - 将这些上传的文件压缩成单个zip存档。

将此Zip文件存储在GAE BlobStore中。

4 - 从blobstore获取(提供)此邮政编码到PC(下载此邮箱以便在本地提供)。

步骤1,2和3正确完成,但步骤4中的问题;我无法从blobstore下载此Zip; 这是我使用的代码:

from __future__ import with_statement
from google.appengine.api import files
import cgi, cgitb ; cgitb.enable()
import StringIO
import zipfile
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.util import run_wsgi_app
glob_blob_info="" 
class zip():
    def z(self):
        form = cgi.FieldStorage()
        zipstream=StringIO.StringIO()
        zfile = zipfile.ZipFile(file=zipstream,mode="w",compression=zipfile.ZIP_DEFLATED)
        file_upload = form['file[]']
        filename2 = file_upload.filename
        data=file_upload.file.read()
        zfile.writestr(filename2,data)
        zfile.close()
        zipstream.seek(0)
        zip_file = files.blobstore.create(mime_type='application/zip',_blobinfo_uploaded_filename='test.zip')
        with files.open(zip_file, 'a') as f:
            f.write(zipstream.getvalue())
        files.finalize(zip_file)
        blob_key = files.blobstore.get_blob_key(zip_file)
        print blob_key
        blob_info = blobstore.BlobInfo.get(blob_key)
        print blob_info
        global glob_blob_info
        glob_blob_info=blob_info
class ServeHandler(blobstore_handlers.BlobstoreDownloadHandler):
  def get(self):
    print "doaa"
    global glob_blob_info 
    glob_blob_info = urllib.unquote(glob_blob_info)
    blob_info = blobstore.BlobInfo.get(glob_blob_info)
    self.send_blob(glob_blob_info,save_as=True)



def main():
    application = webapp.WSGIApplication( [('/serve', ServeHandler),], debug=True)
    debug=True)
    c=zip()
    c.z()
    run_wsgi_app(application)

if __name__ == "__main__":
    main()

现在成功执行class zip(),以便在GAE Blobstore中成功创建包含用户上传文件的zip存档,但问题恰恰在于class ServeHandler(blobstore_handlers.BlobstoreDownloadHandler):没有执行 当我运行此代码时,我有这个输出:

Status: 404 Not Found 
Content-Type: text/html;
charset=utf-8 Cache-Control: no-cache
Expires: Fri, 01 Jan 1990 00:00:00 GMT 
Content-Length: 0

对此问题有任何想法吗?先谢谢。

2 个答案:

答案 0 :(得分:1)

为一个描述here的blob服务的哪个部分不适合你?

答案 1 :(得分:1)

我知道这可能很明显但是你的app.yaml设置为处理该应用程序路径?这会给你一个404.你也为什么在这里使用全局?我会避免这种情况。将URL安全blob密钥作为URL的一部分或URL参数传递给它,并从中获取blob信息。如果你使用带有appengine的全局,你将会遇到各种各样的潜在问题。

我已经使用blob存储来做各种各样的文件,从来没有遇到过问题。你的代码/应用程序最有可能是send_blob的错误。