我将图片存储为数据存储区中的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
在下载结束时,我得到的是一个大的二进制文件,文件夹图片为空。 谢谢你的帮助!
答案 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)