将数据存储区中的blob属性导出为二进制文件

时间:2012-02-29 17:15:04

标签: google-app-engine google-cloud-datastore

我将图片存储为数据存储区中的Blob属性,我没有使用Blobstore,只使用Blob属性。

现在我想将我的应用程序迁移到另一个平台,我想将这些图片作为JPEG文件输出。有没有办法使用bulkloader工具或使用appengine提供的映射器工具?

谢谢!

更新

我尝试使用blob_to_file转换助手,但无法使其正常工作。

这是我的bulkloader.yaml文件

python_preamble:
- import: base64
- import: re
- import: google.appengine.ext.bulkload.transform
- import: google.appengine.ext.bulkload.bulkloader_wizard
- import: google.appengine.ext.db
- import: google.appengine.api.datastore
- import: google.appengine.api.users

transformers:

- kind: File
  connector: csv
  connector_options:
      encoding: utf-8
      columns: from_header

  property_map:

      - property: fileId
          external_name: fileId

      - property: bytes_content
          external_name: local_filename
          export_transform: transform.blob_to_file('fileId', 'pictures')

这是我的文件模型:

class File(db.Model):
    fileId = db.IntegerProperty()
    bytes_content = db.BlobProperty()

我使用以下命令运行bulkloader:

appcfg.py download_data --application=XXXX --kind=File --url=XXXXX/_ah/remote_api --filename=File.csv --config_file=bulkloader.yaml

在下载结束时,我得到的是一个大的二进制文件,文件夹图片为空。 谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

您可以使用“Bulkloader Transform Helper function”blob_to_file()。一般信息可以在http://code.google.com/appengine/docs/python/tools/uploadingdata.html和Nick Johnson的文章中找到:http://blog.notdot.net/2010/04/Using-the-new-bulkloader

特别是对于BlobProperty导出,请查看bulkloader示例应用:http://bulkloadersample.appspot.com/

当您查看'bulkloader.yaml'文件时,您会发现:

python_preamble:
- import: google.appengine.ext.bulkload.transform

和此:

# A sample writing a BlobProperty to an external file.
# (Note: not a BlobReferenceProperty.)
- model: models.Attachment
  connector: csv
  connector_options:
    encoding: utf-8
    columns: from_header
  property_map:
    - property: __key__
      external_name: ID
      export_transform: datastore.Key.name
    - property: filename
      external_name: filename
    - property: filecontents
      external_name: local_filename
      export_transform:
        transform.blob_to_file('filename', 'AttachmentBlobs')

答案 1 :(得分:1)

您还有两种选择: 1)使用URL Fetch将数据发送到其他系统 2)如果图像数量不是很大,可以逐个下载。我提取了一些工作代码作为例子:

    kwis = KindWithImages.get_by_key_name(file_name)              
    if kwis: 
        (content_type, encoding) = mimetypes.guess_type(kwis.file_ext)
        logging.info('download : %s%s content-type %s encoding %s' % (file_name, kwis.file_ext, content_type, encoding))
        if content_type == None :
            self.response.out.write('Content_type unknown for : %s' % (kwis.file_ext))
        else :
            self.response.headers['Content-Type'] = content_type
            self.response.headers['Content-Disposition'] = 'attachment; filename=%s%s' % (file_name, kwis.file_ext)
            self.response.out.write(kwis.content)