Python 如何使用Plone.api create和NamedBlobFile在Plone中处理上载文件
亲爱的 我已经创建了一个脚本来读取txt并在Plone站点Plone 4.3.10中进行上传。 脚本如下: 我使用Tango先生描述的技巧: 我的困难在于将该文件附加到在FOR开头创建的新项目中,特别是在以下段落中:Python 如何使用Plone.api create和NamedBlobFile在Plone中处理上载文件,python,blob,plone,zope,Python,Blob,Plone,Zope,亲爱的 我已经创建了一个脚本来读取txt并在Plone站点Plone 4.3.10中进行上传。 脚本如下: 我使用Tango先生描述的技巧: 我的困难在于将该文件附加到在FOR开头创建的新项目中,特别是在以下段落中: file_obj.file = NamedBlobFile( data=open(pdf_path, 'r').read(), contentType='application/pdf', filename=unicode
file_obj.file = NamedBlobFile(
data=open(pdf_path, 'r').read(),
contentType='application/pdf',
filename=unicode(file_obj.id, 'utf-8'),
)
参数数据,从文件系统接收PDF文件,但是,不要在新创建的新对象中设置文件
谢谢你的关注
[更新]
使用pdb,我看到一些输出、数据、contentType n文件名显然设置正确
那么,我哪里出错了?
或者什么类型的数据输入?
我不是专业的python程序员。。。就像你看到的。。。如果有人使用plone.api并将pdf上传到plone,您是如何做到的
36 pdf_path,
37 filename=unicode(file_obj.id, 'utf-8'),
38 )
39 print('\n \n Criado: '+row['NDOPROCESSO']+'.')
40 transaction.commit()
41
42 pdf_file.close()
43 -> break
44 csvfile.close()
45
(Pdb) file_obj.file.data
'INMEQ/PastaGeral/PROCESSOINMEQ-AL.PDF'
(Pdb) file_obj.file.contentType
'application/pdf'
(Pdb) file_obj.file.filename
u'processoinmeq-al.pdf'
[更新2]
@马西亚斯,首先,你很棒
我的O.S.是:
jaf@ocs:~/plone4310/zinstance$ uname -a
Linux ocs 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt11-1+deb8u6 (2015-11-09) x86_64 GNU/Linux
看看我的尝试:
jaf@ocs:~/plone4310/zinstance$ bin/instance -O a debug
Starting debugger (the name "app" is bound to the top-level Zope object)
>>> plone = app.a
>>> plone
<PloneSite at /a>
>>> from zope.component.hooks import setSite
>>> setSite(plone)
>>> from plone import api
>>> pdfpath = 'INMEQ/PastaGeral/PROCESSOINMEQ-AL.PDF'
#I tried too with a full path, like you see in image print below
#'/home/jaf/plone4310/zinstance/INMEQ/PastaGeral/PROCESSOINMEQ-AL.PDF'
>>> pdfpath
'INMEQ/PastaGeral/PROCESSOINMEQ-AL.PDF'
>>> obj = api.content.create(type='File', title='a file', container=plone)
>>> obj
<ATFile at /a/a-file> #unique difference, between you and me, is ATFile not File.
>>> obj.id
'a-file'
>>> file_ = plone.get(obj.id)
>>> file_
<ATFile at /a/a-file>
>>> file_ = plone.get('a-file')
>>> file_
<ATFile at /a/a-file>
>>> from plone.namedfile.file import NamedFile
>>> pdf = open(pdfpath, 'r')
>>> pdf
<open file 'INMEQ/PastaGeral/PROCESSOINMEQ-AL.PDF', mode 'r' at 0x7f41b7b48030>
>>> file_.file = NamedFile(data=pdf, filename=unicode(obj.id, 'utf-8'), contentType='application/pdf')
>>> file_.file
<plone.namedfile.file.NamedFile object at 0x7f41b7b42500>
>>> import transaction
>>> transaction.commit()
>>> file_.file
<plone.namedfile.file.NamedFile object at 0x7f41b7b42500>
>>>
PDF是一种二进制格式,因此您可能希望了解如何在Python中打开文件。类似data=openpdf_的路径,“rb”应该会有所帮助
另外,我建议您了解pdb,并在此行前插入一个断点,以便检查是否一切正常。PDF是一种二进制格式,因此您可能希望了解如何使用Python打开文件。类似data=openpdf_的路径,“rb”应该会有所帮助
另外,我建议您了解pdb,并在此行前插入一个断点,以便检查是否一切正常。以下内容适用于Plone 4.3.10+Plone.app.contenttypes默认DX类型
>>> plone = app.Plonedemo
>>> plone
<PloneSite at /Plonedemo>
>>> from zope.component.hooks import setSite
>>> setSite(plone)
>>> from plone import api
>>> pdfpath = '/Users/PATHTOPDF'
>>> obj = api.content.create(
... type='File',
... title='a file',
... container=plone)
>>> file_ = plone.get('a-file')
>>> file_
<File at /Plonedemo/a-file>
看起来您需要交付一个文件处理程序,而不是实际的内容
本例使用的是原型默认setter/getter。以下内容适用于Plone 4.3.10+Plone.app.contenttypes默认DX类型
>>> plone = app.Plonedemo
>>> plone
<PloneSite at /Plonedemo>
>>> from zope.component.hooks import setSite
>>> setSite(plone)
>>> from plone import api
>>> pdfpath = '/Users/PATHTOPDF'
>>> obj = api.content.create(
... type='File',
... title='a file',
... container=plone)
>>> file_ = plone.get('a-file')
>>> file_
<File at /Plonedemo/a-file>
看起来您需要交付一个文件处理程序,而不是实际的内容
本例使用的是原型默认setter/getter。我使用openpdf_路径“r”。bytes:-@Mathias,我使用了一个,但这个对象没有属性:`pdf_file=openpdf_路径,“r”。bytes``AttributeError:'file'对象没有属性“bytes”`Davi Lima,我尝试了“rb”,但不起作用。。。我读过关于开放对象的书。。。我几乎没有Python方面的经验。。。伙计们!我使用openpdf\u路径“r”。字节:-@Mathias,我使用了一个,但这个对象没有属性:`pdf\u file=openpdf\u路径,“r”。字节``AttributeError:'file'对象没有属性“bytes”`Davi Lima,我尝试了“rb”,但是,不起作用。。。我读过关于开放对象的书。。。我几乎没有Python方面的经验。。。伙计们!啊,啊,啊。。。我的文件在那里,我可以下载它!你能做一个lenfile.file.data吗?确保该文件位于调试控制台中!您还可以检查var/blobstorage目录,它也应该在那里。在提交调试会话并且没有结束调试会话之后,存储的磁盘使用率是ist 44K吗?是的,这可能意味着您的存储有一些问题,并且您的应用程序无法访问文件系统。这可能是个愚蠢的问题,但是你的用户使用的是运行zope的,它能在你的blob目录中写吗?我添加了一个原型示例。我朝着完全扭曲的方向跑去。我假设您使用的是灵巧内容类型,但在Plone 4.3.10中,原型仍然是默认的内容类型。那么,我发布的原型方法应该可以工作。我发布的灵巧解决方案和具有原型的解决方案都可以在我的笔记本电脑上工作,也可以在centOS机器上工作。我不知道你的情况有什么不对劲。。。我的文件在那里,我可以下载它!你能做一个lenfile.file.data吗?确保该文件位于调试控制台中!您还可以检查var/blobstorage目录,它也应该在那里。在提交调试会话并且没有结束调试会话之后,存储的磁盘使用率是ist 44K吗?是的,这可能意味着您的存储有一些问题,并且您的应用程序无法访问文件系统。这可能是个愚蠢的问题,但是你的用户使用的是运行zope的,它能在你的blob目录中写吗?我添加了一个原型示例。我朝着完全扭曲的方向跑去。我假设您使用的是灵巧内容类型,但在Plone 4.3.10中,原型仍然是默认的内容类型。那么,我发布的原型方法应该可以工作。我发布的灵巧解决方案和具有原型的解决方案都可以在我的笔记本电脑上工作,也可以在centOS机器上工作。我不知道你的情况怎么了。。。
>>> from plone.namedfile.file import NamedFile
>>> pdf = open(pdfpath, 'r')
>>> pdf
<open file '/Users/PATHTOPDF', mode 'r' at 0x10dca3150>
>>> file_.file = NamedFile(data=pdf, filename=u'bla.pdf', contentType='application/pdf')
>>> import transaction
>>> transaction.commit()
>>> file_.file
<plone.namedfile.file.NamedFile object at 0x10dca0230>
...
>>> pdf = open(pdfpath, 'r')
>>> pdf
<open file '/Users/PATHTOPDF', mode 'r' at 0x10dca3150>
>>> file_.setFile(pdf) # filehandler, NOT THE NAMEDFILE.
>>> obj.getFile().size()
155847
>>> import transaction
>>> transaction.commit()