将blobstore blob作为文件处理(python)

时间:2013-01-09 10:32:50

标签: python google-app-engine blobstore

我想使用GAE创建一个进程,通过该进程,给定一个url,下载文件并将其作为blob存储在blobstore中。完成此操作后,我想将此blob作为POST数据传递给第二个URL。但是,要使第二部分工作,我需要能够将blob作为文件实例打开。

我已经想出了如何做第一部分

from __future__ import with_statement
from google.appengine.api import files

imagefile = urllib2.urlopen('fileurl')
# Create the file
file_name = files.blobstore.create(mime_type=imagefile.headers['Content-Type'])
# Open the file and write to it
with files.open(file_name, 'ab') as f:
    f.write(imagefile.read())
# Finalize the file. Do this before attempting to read it.
files.finalize(file_name)
# Get the file's blob key
blob_key = files.blobstore.get_blob_key(file_name)

但我无法弄清楚如何做第二部分。到目前为止我已经尝试了

  1. ffile = files.open(files.blobstore.get_file_name(blob_key), 'r')

  2. from google.appengine.ext import blobstore

    ffile = blobstore.BlobReader(blob_key)
    
  3. from google.appengine.ext import blobstore

    ffile = blobstore.BlobInfo.open(blobstore.BlobInfo(blob_key))
    
  4. 所有这些都为False提供isinstance(ffile, file)

    感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

ffile = blobstore.BlobReader(blob_key)有效。但是,返回的对象只有类文件接口;它不会扩展文件类。因此,实例测试不会起作用。尝试类似if ffile and "read" in dir( ffile )的内容。

答案 1 :(得分:1)

从blobstore读取file_data:

blob_key = .....                                        # is what you have
file_name = blobstore.BlobInfo.get(blob_key).filename   # the name of the file (image) to send 
blob_reader = blobstore.BlobReader(blob_key)
file_data = blob_reader.read()                          # and the file data with the image

但您也可以使用blob_key发送网址并提供网址。对于图像,您不必自己提供图像,因为您可以发布get_serving_url,利用Google High Perfomance Image Serving API进行动态缩放。以这种方式提供图像也非常便宜。

以下是此类网址的示例:

https://lh6.ggpht.com/lOghqU2JrYk8M-Aoio8WjMM6mstgZcTP0VzJk79HteVLhnwZy0kqbgVGQZYP8YsoqVNzsu0EBysX16qMJe7H2BsOAr4j=s70