当我尝试通过FTP将带有非ascii字符的文件(如德语变音符号)上传到Zope(进入ZODB)时,我收到以下错误消息:
ERROR Zope.SiteErrorLog 1351502922.570.290289062967 http://0.0.0.0:8021/Zope2/websites/O%CC%88su%CC%88ra%CC%88ich.png/PUT
Traceback (innermost last):
Module ZPublisher.Publish, line 126, in publish
Module ZPublisher.mapply, line 77, in mapply
Module ZPublisher.Publish, line 46, in call_object
Module webdav.NullResource, line 173, in PUT
Module OFS.ObjectManager, line 325, in _setObject
Module OFS.ObjectManager, line 97, in checkValidId
BadRequest: The id "Ösüräich.png" contains characters illegal in URLs.
这是有道理的。但是,我正在使用PUT_factory,以便上传的文件将作为我的一个自定义对象类型添加到ZODB中。在此类的__init__
中,我将文件名更改为在Zope中为有效ID的字符串。我已将self.__name__
和self.id设置为此字符串,但错误仍然存在。
为了进行调试,我在__init__
raise Exception, self.id
它给了我正确的有效ID。但是,当我删除最后一行时,我再次收到上述错误。显然,没有创建新对象(不调用manage_afterAdd方法)。
有没有办法解决这个问题,还是我必须忍受Zope的限制?
答案 0 :(得分:2)
不幸的是,你被困了,我很害怕。正在上传的对象的__name__
将被完全忽略。
这是怎么回事:
webdav.NullResource.NullResource
对象
.PUT()
方法]。以下代码是该方法的一部分,它创建对象并将其存储在父对象上(简化):
factory = getattr(parent, 'PUT_factory', self._default_PUT_factory )
ob = factory(name, typ, body)
if ob is None:
ob = self._default_PUT_factory(name, typ, body)
# Verification it can be added here
self.__parent__._setObject(name, ob)
如您所见,name
变量未更新。
您可以提交issue in the tracker,要求在那里咨询__name__
。