提取OFS Image Pdata对象并将其保存为Dexterity上的Namedfile

时间:2015-04-06 14:29:57

标签: python plone dexterity archetypes

我有一个Archetype内容,其中包含名为 file 的字段,它是MultiFileField(来自archetypes.multifile.MultiFileField)。架构类似于:

MultiFileField('file',
       primary=True,
       languageIndependent=True,
       widget = MultiFileWidget(
        label= "File Uploads",
        show_content_type = False,))

我有一个具有相同字段名称文件的敏捷内容类型,我想创建一个脚本,从Archetype内容中提取存储的上传对象,并在Dexterity自定义上传递它内容类型。 Dexterity自定义内容类型的架构是:

form.widget(file=MultiFileFieldWidget)
file = schema.List(
        title=_(u"File Attachment"),
        required=False,
        value_type=NamedFile(),
    )

我观察到Archetype的MultiFileField将上传的对象存储为OFS Image Pdata,而后者则将其存储为plone.namedfile.file.NamedFile对象。有没有办法将OFS对象转换为Namedfile对象?

更新: 我找到了一个解决方案,但我不确定这是否正确。

for field in prev_obj.Schema().fields():
    key = field.getName()
    objects_list = []
    value = field.getRaw(prev_obj)
    for f in value:
        data = str(f['file'].data)
        filename = unicode(f['filename'])
        contentType = f['content_type']
        fileData = NamedFile(data=data, contentType=contentType, filename=filename)
        objects_list.append(fileData)
    new_obj.file = copy.copy(objects_list)

1 个答案:

答案 0 :(得分:0)

首先,你可能想要使用NamedBlobFile。

然后,你尝试过这样的东西来转换数据吗?

from plone.namedfile.file import NamedBlobFile
new_obj.file = [NamedBlobFile(str(fdata), contentType=fdata.content_type, filename=fdata.filename) for fdata in previous_obj.getFile()]

假设您同时拥有previous_obj和new_obj。