我有一个 Plone 应用程序,可以在其中上传 ATImages 图像。我想验证扩展文件(主要是禁止 pdf 文件)。有一个像http://blablba.com/createObject?type_name=Image 这样的 url 调用创建的
我想我可以编写一个扩展 ATImages 的新类,创建一个带有验证器的表单,但它看起来有点复杂,而且 content_type 注册表上的一些设置似乎就足够了(或其他地方)。
你会怎么做?(禁止pdf?)
谢谢
我有一个 Plone 应用程序,可以在其中上传 ATImages 图像。我想验证扩展文件(主要是禁止 pdf 文件)。有一个像http://blablba.com/createObject?type_name=Image 这样的 url 调用创建的
我想我可以编写一个扩展 ATImages 的新类,创建一个带有验证器的表单,但它看起来有点复杂,而且 content_type 注册表上的一些设置似乎就足够了(或其他地方)。
你会怎么做?(禁止pdf?)
谢谢
我们遇到了类似的问题。
Archetypes 在其魔法期间会触发几个事件,其中包括“验证后事件”(IObjectPostValidation)。通过这种方式,我们添加了对内容类型的检查。
订户(zcml):
<subscriber provides="Products.Archetypes.interfaces.IObjectPostValidation"
factory=".subscribers.ImageFieldContentValidator" />
快速而肮脏的实施:
from Products.Archetypes.interfaces.field import IImageField
from plone.app.blob.interfaces import IBlobImageField
from Products.Archetypes.interfaces import IObjectPostValidation
from zope.interface import implements
from zope.component import adapts
# import your message factory as _
ALLOWED_IMAGETYPES = ['image/png',
'image/jpeg',
'image/gif',
'image/pjpeg',
'image/x-png']
class ImageFieldContentValidator(object):
"""Validate that the ImageField really contains a Imagefile.
Show a Errormessage if it doesn't.
"""
implements(IObjectPostValidation)
adapts(IBaseObject)
img_interfaces = [IBlobImageField, IImageField]
msg = _(u"error_not_image",
default="The File you wanted to upload is no image")
def __init__(self, context):
self.context = context
def __call__(self, request):
for fieldname in self.context.Schema().keys():
field = self.context.getField(fieldname)
if True in [img_interface.providedBy(field) \
for img_interface in self.img_interfaces]:
item = request.get(fieldname + '_file', None)
if item:
header = item.headers
ct = header.get('content-type')
if ct in ALLOWED_IMAGETYPES:
return
else:
return {fieldname: self.msg}