2010-10-21 3 views
0

У меня есть модель с файловым полем на нем. У меня есть сигнал post_save, прикрепленный к модели, чтобы затем я мог передать загруженный файл третьей стороне через веб-службу (используя Suds). Вызов веб-службы умирает, когда я пытаюсь передать ему содержимое файла: он выдает «UnicodeDecodeError:« ascii »кодек не может декодировать байт ...» (как в this SO question).Django: Чтение содержимого FileField сразу после сохранения

То, что я не получаю: когда я выливать содержимое файла на экран во время моего вызова сигнала, он выглядит как беспорядок плохо закодированный мусора:

åÉ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\[email protected]\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]\[email protected]\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' 

то, что происходит между этими двумя шагами, и как я могу получить надлежащее содержание обратно? Схватив вторую версию объекта во время моего сигнала, я снова возвращаю плохо зашифрованный беспорядок. N.B., это происходит в Windows.

ответ

0

ASCII-кодек, очевидно, не может декодировать это, потому что это не ASCII. Я думаю, вам нужно будет узнать кодировку данных и передать строку Юникода в Suds. Например, если кодировка UTF-16 проходит unicode(binarydata, 'utf-16') в Suds.

То, что вы рассматриваете как беспорядок плохо кодированного мусора, в первом примере - это просто то, что отображается на экране, когда вы позволяете ему показывать двоичные данные. Символы, отображаемые здесь, зависят от конфигурации набора символов вашей системы.

Ваш второй пример - строковое представление Python некоторых двоичных данных. Строковое представление содержит только печатные символы ASCII. Символы непечатаемые или не ascii отображаются с использованием шестнадцатеричной нотации. Это строковое представление просто показывает байты ваших данных и не говорит вам, хорошо ли кодируются данные или нет в некотором наборе символов.

Я не смог правильно определить кодировку вашего второго примера. Ближе всего я нашел «utf-16-le». Но это все еще вызывает ошибки декодирования у суррогатных пар.

Использование s.decode('utf-16-le', 'replace') Я получил кучу китайских иероглифов:

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

Интересно то, что Google переводит третий символ, , чтобы http.

UPDATE: Следующая интерактивная сессия Python может пояснить, что я имею в виду мой комментарий ниже:

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

Я понимаю, что первый является двоичным кодируются версия файла. Я не понимаю, почему я получаю это, когда я обращаюсь к файлу за время сохранения, но получаю представление Unicode, когда я его открываю в командной строке. Я предполагаю, что это имеет какое-то отношение к тому, чтобы быть в Windows и кодировке, установленной в моих файлах кода. – Tom

+0

@Tom: Я предполагаю, что в первой версии вы напрямую печатаете двоичный контент файла на экран, тогда как во второй версии вы позволяете Python печатать строковое представление данных (возможно, в интерактивной оболочке Python?). Вторая версия все еще не юникод - строковое представление просто показывает байты. Представление Python строки unicode будет выглядеть как 'u '\ u4600 \ u4b2c \ u59d8'' (это первые три китайских иероглифа сверху). –

Смежные вопросы