Django: чтение содержимого FileField сразу после сохранения - PullRequest
0 голосов
/ 22 октября 2010

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

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

åÉ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'

Что происходит между этими двумя шагами и как я могу вернуть правильное содержимое?Взятие второй версии объекта во время моего сигнала просто возвращает мне плохо закодированный беспорядок.NB, это происходит в Windows.

1 Ответ

0 голосов
/ 22 октября 2010

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

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

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

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

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

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

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

ОБНОВЛЕНИЕ: Следующая интерактивная сессия Python может прояснить, что я имею в виду в моем комментарии ниже:

>>> s = '\x00F,K\xd8Y'
>>> print(s)
F,K�Y
>>> u = s.decode('utf-16-le')
>>> u
u'\u4600\u4b2c\u59d8'
>>> print(u)
䘀䬬姘
>>> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...