Python 用GAE发送_blob

Python 用GAE发送_blob,python,google-app-engine,blobstore,Python,Google App Engine,Blobstore,我在GAE中的blobstore中创建了zip文件,然后我尝试使用以下代码获取(下载)此zip文件: def send_blob(blob_key_or_info, content_type=None, save_as=None): CONTENT_DISPOSITION_FORMAT = "attachment; filename=\"%s\"" if isinstance(blob_key_or_info, blobstore.BlobInfo): blo

我在GAE中的blobstore中创建了zip文件,然后我尝试使用以下代码获取(下载)此zip文件:

def send_blob(blob_key_or_info, content_type=None, save_as=None):

    CONTENT_DISPOSITION_FORMAT = "attachment; filename=\"%s\""

    if isinstance(blob_key_or_info, blobstore.BlobInfo):
        blob_key = blob_key_or_info.key()
        blob_info = blob_key_or_info
    else:
        blob_key = blob_key_or_info
        blob_info = None
    if blob_info:
        content_type = content_type or mime_type(blob_info.filename)
        save_as = save_as or blob_info.filename
        #print save_as
    logging.debug(blob_info)
    response = Response()
    response.headers[blobstore.BLOB_KEY_HEADER] = str(blob_key)
    if content_type:
        if isinstance(content_type, unicode):
            content_type = content_type.encode("utf-8")
        response.headers["Content-Type"] = content_type
    else:
        del response.headers["Content-Type"]

    def send_attachment(filename):
        if isinstance(filename, unicode):
            filename = filename.encode("utf-8")
        response.headers["Content-Disposition"] = (\
            CONTENT_DISPOSITION_FORMAT % filename)
    if save_as:
        if isinstance(save_as, basestring):
            send_attachment(save_as)
        elif blob_info and save_as is True:
            send_attachment(blob_info.filename)
        else:
            if not blob_info:
                raise ValueError("Expected BlobInfo value for blob_key_or_info.")
            else:
                raise ValueError("Unexpected value for save_as")
    return response
如果我在main中调用这个函数并从这个函数(response)中打印返回值,我会得到例如: 200行 内容长度:0 X-AppEngine-BlobKey:C25nn_O04JT0r8kwHeabDw== 内容类型:应用程序/zip 内容处置:附件;filename=“test.zip” 但问题是,我现在如何使用此响应将文件下载到我的PC?
提前感谢。

您需要实现一个Blobstore下载处理程序来为文件提供服务。例如:

from google.appengine.ext.webapp import blobstore_handlers

class ServeZip(blobstore_handlers.BlobstoreDownloadHandler):
  def get(self):
    blob_key = self.request.get('key')
    if not blobstore.get(blob_key):
      logging.info('blobstore.get(%s) failed' % blob_key)
      self.error(404)
      return

    self.send_blob(blob_key)
    return
然后在客户机上调用:
http://yourapp.appspot.com/servezip?key=


对于上面的示例:
http://yourapp.appspot.com/servezip?key=C25nn_O04JT0r8kwHeabDw%3D%3D

您需要实现一个Blobstore下载处理程序来为文件提供服务。例如:

from google.appengine.ext.webapp import blobstore_handlers

class ServeZip(blobstore_handlers.BlobstoreDownloadHandler):
  def get(self):
    blob_key = self.request.get('key')
    if not blobstore.get(blob_key):
      logging.info('blobstore.get(%s) failed' % blob_key)
      self.error(404)
      return

    self.send_blob(blob_key)
    return
然后在客户机上调用:
http://yourapp.appspot.com/servezip?key=


对于上面的示例:
http://yourapp.appspot.com/servezip?key=C25nn_O04JT0r8kwHeabDw%3D%3D

Google提供了非常好的api来处理BlobStore对象,主要是两个名为BlobstoreDownloadHandler和BlobstoreUploadHandler的CLS

要下载内容,请尝试使用BlobstoreDownloadHandler,下面的代码可以帮助您理解这个概念

    from google.appengine.ext.webapp import blobstore_handlers
    from google.appengine.ext.blobstore import BlobKey

    class VideoDownloadHelper(blobstore_handlers.BlobstoreDownloadHandler):
        def get(self, blobkey):
            blobKey = BlobKey(blobkey)
            #content_type is optional and by default it is same as uploaded content's content-type.
            self.send_blob(blobKey, content_type="image/jpeg")
这个方法可以像这样使用

    app = webapp2.WSGIApplication([(r'/download-video/([^\.]+)', VideoDownloadHandler)])
为了进一步阅读,你可以阅读以下内容
谷歌提供了非常好的api来处理BlobStore对象,主要是两个名为BlobstoreDownloadHandler和BlobstoreUploadHandler的CLS

要下载内容,请尝试使用BlobstoreDownloadHandler,下面的代码可以帮助您理解这个概念

    from google.appengine.ext.webapp import blobstore_handlers
    from google.appengine.ext.blobstore import BlobKey

    class VideoDownloadHelper(blobstore_handlers.BlobstoreDownloadHandler):
        def get(self, blobkey):
            blobKey = BlobKey(blobkey)
            #content_type is optional and by default it is same as uploaded content's content-type.
            self.send_blob(blobKey, content_type="image/jpeg")
这个方法可以像这样使用

    app = webapp2.WSGIApplication([(r'/download-video/([^\.]+)', VideoDownloadHandler)])
为了进一步阅读,你可以阅读以下内容

:当我将这个类处理程序放在单独的页面中,然后将密钥传递给它时,问题是:状态:404未找到内容类型:text/html;charset=utf-8缓存控制:无缓存过期:Fri,1990年1月1日00:00:00 GMT内容长度:0,处理程序未执行。对此问题有何想法?您是否在日志中看到“blobstore.get(…)failed”错误?如果是这样,您可能传递了错误的密钥,或者未能正确地对密钥进行URL编码。如果没有,您可能没有在应用程序中正确添加处理程序。yaml.:当我将此类处理程序放在单独的页面中,然后将密钥传递给它时,问题是:状态:404未找到内容类型:text/html;charset=utf-8缓存控制:无缓存过期:Fri,1990年1月1日00:00:00 GMT内容长度:0,处理程序未执行。对此问题有何想法?您是否在日志中看到“blobstore.get(…)failed”错误?如果是这样,您可能传递了错误的密钥,或者未能正确地对密钥进行URL编码。否则,您可能没有在app.yaml中正确添加处理程序。