代码之家  ›  专栏  ›  技术社区  ›  Tom

django:保存后立即读取文件字段内容

  •  0
  • Tom  · 技术社区  · 14 年前

    我有一个模型表单,上面有一个文件字段。我在模型上附加了post_save信号,这样我就可以通过web服务(使用 Suds )当我试图传递文件内容时,web服务调用将终止:它抛出“unicodedecodeerror:”ascii“编解码器无法解码字节。…(很像 this SO question )

    我不明白的是:当我在信号调用期间将文件内容转储到屏幕上时,它看起来像是一团编码错误的垃圾:

    åÉe Qçú>↑ Åû½ΣΘ⌐v^τ  F,K╪Y<▲î°bαⁿ╡ê5  ╜ù  sö╛Aî▲ƒF|04∙f╛@╙We⌡  ╤â╩_α↑└ƒ∙│ßï(è═|←⌂┌▒■µ'£─♂  ¢V↓ⁿq_;εδ▼εb<í╜ƒÅΩN00τó╛‼¥U╫Z─)?¬∞┐Γ╠C4ä▬Il☼Jº╚J╥Ñ├¿öÆi2═♂ïσNù&▐╤╡╔ΩIêµ╬]└@Üα╒→║¶\⌐UÑ╬çµ∟h⌂¼┘ë¢←↕╚↔ùα▌.¢d╖Y¡,♫½qÆ~╞äLX┬ä[┬2≥¥í=<ß▼]Hⁿ↕!b÷ ñÑU┌M╥╦m¼'½ù'∞"'£└►oêu↓q┘ôÉ>i_÷αµ0♥k§w▒c╠═╬6╙N2▀!)`►
    

    当我通过命令行获取同一个对象并对其调用完全相同的方法时,它看起来都经过了很好的编码:

    \x00F,K\xd8Y<\x1e\x8c\xf8b\xe0\xfc\xb5\x885\xff\x00\xbd\x97\xff\x00s\x07\x94\xbeA\x8c\x1e\x9fF|04\xf9f\xbe@\xd3We\xf5\xff\x00\xd1\x83\xca_\xe0\x18\xc0\x9f\xf9\xb3\xe1\x8b(\x8a\xcd|\x1b\x7f\xda\xb1\xfe\xe6\'\x9c\xc4\x0b\xff\x00\x9bV\x19\x07\xfcq_;\xee\xeb\x1f\xeeb<\xa1\xbd\x9f\x8f\xeaN00\xe7\xa2\xbe\x13\x9dU\xd7Z\xc4)?\xaa\xec\xbf\xe2\xccC4\x84\x16Il\x0fJ\xa7\xc8J\xd2\xa5\xc3\xa8\x94\x92i2\xcd\x0b\x8b\xe5N\x97&\xde\xd1\xb5\xc9\xeaI\x88\xe6\xce]\xc0@\x9a\xe0\xd5\x1a\xba\x14\\\xa9U\xa5\xce\x87\xe6\x1ch\x7f\xac\xd9\x89\x9b\x1b\x12\xc8\x1d\x97\xe0\xdd.\x9bd\xb7Y\xad,\x0e\xabq\x92~\xc6\x84LX\xc2\x84[\xc22\xf2\x9d\xa1=<\xe1\x1f]H\xfc\x12!b\xf6\x00\xa4\xa5U\xdaM\xd2\xcbm\xac\'\xab\x97\'\xec"\'\x9c\xc0\x10o\x88u\x19q\xd9\x93\x90>i_\xf6\xe0\xe60\x03k\x15w\xb1c\xcc\xcd\xce6\xd3N2\xdf!)`\x10\nB\x8a\xaes\x13\xad\xd4a\x19\xa7p?\xff\xd9'
    

    这两个步骤之间发生了什么?我怎样才能找回正确的内容?在我发信号的时候抓取第二个版本的对象只会让我再次回到编码错误的混乱状态。注意,这是在Windows上发生的。

    1 回复  |  直到 8 年前
        1
  •  0
  •   Bernd Petersohn    14 年前

    一个ascii编码显然不能解码,因为它不是ascii。我认为您必须找出数据的编码并将unicode字符串传递给suds。例如,如果编码是utf-16 pass unicode(binarydata, 'utf-16') 泡沫。

    在第一个示例中,您将其视为一团编码错误的垃圾,这只是当您让屏幕显示二进制数据时屏幕所显示的内容。此处显示的字符取决于系统的字符集配置。

    第二个例子是python对一些二进制数据的字符串表示。字符串表示只包含可打印的ascii字符。使用十六进制表示法显示不可打印或非ascii字符。这个字符串表示只显示数据的字节数,而不告诉您数据是否在某个字符集中进行了良好的编码。

    我无法正确识别你的第二个例子的编码。我找到的最接近的是“utf-16-le”。但这仍然会导致代理项对的解码错误。

    使用 s.decode('utf-16-le', 'replace') 我有一堆汉字:

    䘀䬬姘Ḽ뗼㖈ÿ鞽ÿݳ뺔豁鼞籆㐰曹䂾埓ÿ菑忊ᣠ鿀돹诡訨糍缛뇚鰧௄ÿ嚛ܙ燼㭟㱢붡辟仪〰ꋧᎾ喝嫗⧄꨿뿬쳢㑃ᚄ汉䨏좧퉊쎥钨榒촲謋以⚗퇞즵䧪巎䃀᫕ᒺ꥜ꕕ蟎᳦罨�鮉ማ᷈⻝撛妷ⲭꬎ鉱왾䲄쉘宄㋂鷲㶡崟ﱈℒꐀ喥䷚쯒걭꬧➗⋬鰧Ⴠ衯᥵�邓椾̰ᕫ녷챣컍팶㉎⇟怩ਐ詂玮괓懔ꜙ㽰�
    

    有趣的是谷歌翻译了第三个字符, 姘 ,为了 http .

    更新: 下面的交互式python会话可能会澄清我在下面的评论中的意思:

    >>> s = '\x00F,K\xd8Y'
    >>> print(s)
    F,K�Y
    >>> u = s.decode('utf-16-le')
    >>> u
    u'\u4600\u4b2c\u59d8'
    >>> print(u)
    䘀䬬姘
    >>>