2

ASCII 以外の文字 (ドイツ語のウムラウトなど) を含むファイルを FTP 経由で 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 を使用して、アップロードされたファイルがカスタム オブジェクト タイプの 1 つとして ZODB に追加されるようにしています。このクラスの__init__で、ファイル名を Zope で有効な ID である文字列に変更します。self.__name__この文字列に self.id を設定しましたが、エラーは残ります。

デバッグのために、私の最後の行で例外を発生させます__init__

raise Exception, self.id

これにより、正しい有効な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 に答える