Извлеките объект OFS Image Pdata и сохраните его как Namedfile on Dexterity.

У меня есть содержимое Archetype, в котором есть поле с именем file, и это MultiFileField (из archetypes.multifile.MultiFileField). Схема примерно такая:

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

И у меня есть тип контента Dexterity с тем же именем поля, что и file, и я хочу создать скрипт, который извлекает сохраненный загруженный объект из контента Archetype и передает его пользовательскому типу контента Dexterity. Схема пользовательского типа контента Dexterity:

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

Я заметил, что MultiFileField Archetype сохраняет загруженный объект как 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)

person user1225163    schedule 06.04.2015    source источник


Ответы (1)


Во-первых, вы можете вместо этого использовать 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.

person vangheem    schedule 08.04.2015
comment
Спасибо за ваше предложение, но я попробовал ваш код, и когда я редактировал тип контента, я получил эту ошибку, MimeTypeException: искаженный тип MIME (). - person user1225163; 10.04.2015
comment
хотите попробовать обновленный ответ, который предоставляет contentType и имя файла для NamedBlobFile? - person vangheem; 10.04.2015