使用非ascii文件名的Zope ftp-upload错误

时间:2012-10-29 09:50:58

标签: ftp zope non-ascii-characters

当我尝试通过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的限制?

1 个答案:

答案 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__