2

当我尝试通过 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

这给了我正确的有效身份证件。但是当我删除最后一行时,我再次收到上面的错误。显然,没有创建新对象(没有调用 manage_afterAdd 方法)。

有没有办法解决这个问题,还是我必须忍受 Zope 的限制?

4

1 回答 1

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变量未更新。

您可以在跟踪器中提出问题,请求在__name__那里咨询。

于 2012-10-29T14:19:21.440 回答