Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 1, 2017 12:04:03

Master_Sergius
Зарегистрирован: 2013-09-12
Сообщения: 271
Репутация: +  7  -
Профиль   Отправить e-mail  

Как передать файл через post с именем в юникоде?

Но curl ведь отсылает. Да и на WebUI потом просматривать по имени файлов статистику удобно.



———————————————————————————
Мой блог о семействе *nix: http://nixtravelling.blogspot.com/

Офлайн

#2 Ноя. 1, 2017 12:10:14

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Как передать файл через post с именем в юникоде?

Master_Sergius
Но curl ведь отсылает.
Тут наверняка вопрос кодировки, файл судя по расширению сделан в винде, в винде имена файлов в CP1251, curl вполне может конвертировать их в utf, а ваш скрипт этого скорее всего не делает. Поищите по справке, наверняка где-то этот вопрос решается.



Офлайн

#3 Ноя. 1, 2017 15:15:34

vic57
Зарегистрирован: 2015-07-07
Сообщения: 908
Репутация: +  127  -
Профиль   Отправить e-mail  

Как передать файл через post с именем в юникоде?

может encode/decode помогут

 >>> s = 'фывапролдж.xls'
>>> s.encode('utf-8')
b'\xd1\x84\xd1\x8b\xd0\xb2\xd0\xb0\xd0\xbf\xd1\x80\xd0\xbe\xd0\xbb\xd0\xb4\xd0\xb6.xls'
>>> s.encode('utf-8').decode('cp1251')
'фывапролдж.xls'
>>> s.encode('utf-8').decode('cp1251').encode('cp1251')
b'\xd1\x84\xd1\x8b\xd0\xb2\xd0\xb0\xd0\xbf\xd1\x80\xd0\xbe\xd0\xbb\xd0\xb4\xd0\xb6.xls'
>>> s.encode('utf-8').decode('cp1251').encode('cp1251').decode('utf-8')
'фывапролдж.xls'
>>> 

Офлайн

#4 Ноя. 1, 2017 16:41:03

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9873
Репутация: +  853  -
Профиль   Отправить e-mail  

Как передать файл через post с именем в юникоде?

Отправка

curl -X POST http://localhost:12345 -F "sample=@Квартальный отчет.xls" -F "private=true"

Приём
[guest@localhost ~]$ nc -l 12345
POST / HTTP/1.1
Host: localhost:12345
User-Agent: curl/7.53.1
Accept: */*
Content-Length: 336
Expect: 100-continue
Content-Type: multipart/form-data; boundary=------------------------4672daf0f3358c93

--------------------------4672daf0f3358c93
Content-Disposition: form-data; name="sample"; filename="Квартальный отчет.xls"
Content-Type: application/octet-stream

test

--------------------------4672daf0f3358c93
Content-Disposition: form-data; name="private"

true
--------------------------4672daf0f3358c93--
[guest@localhost ~]$

Просто без всяких кодировок пишет байты в utf-8.



Офлайн

#5 Ноя. 1, 2017 16:41:53

Master_Sergius
Зарегистрирован: 2013-09-12
Сообщения: 271
Репутация: +  7  -
Профиль   Отправить e-mail  

Как передать файл через post с именем в юникоде?

Нашел вот такой выход (каноническая mime-кодировка):

 >>> "=?utf-8?B?%s?" % base64.b64encode('Привет мир.txt')
'=?utf-8?B?0J/RgNC40LLQtdGCINC80LjRgC50eHQ=?'

Тогда оно и на WebUI отображается после отправки нормально, то есть как Привет мир.txt



———————————————————————————
Мой блог о семействе *nix: http://nixtravelling.blogspot.com/

Отредактировано Master_Sergius (Ноя. 1, 2017 16:44:48)

Офлайн

#6 Ноя. 1, 2017 20:39:20

Master_Sergius
Зарегистрирован: 2013-09-12
Сообщения: 271
Репутация: +  7  -
Профиль   Отправить e-mail  

Как передать файл через post с именем в юникоде?

Нашел один проблемный файл, который всё же отсылается, но имя его испорченное таким образом. А всё потому, что когда он попадает в мой автоматический скрипт, то он имеет такое дикое имя:

 u'\xd0\x92\xd0\x9e\xd0\x94\xd0\x9d\xd0\xab\xd0\x99 \xd0\x9a\xd0\x9e\xd0\x94\xd0\x95\xd0\x9a\xd0\xa1 2017.pdf'

То есть, юникодная строка, но не юникод внутри. У меня тоже есть свой WebUI, для манипуляции с этими файлами, и в браузере оно отображается вот так -
 ВОДНЫЙ КОДЕКС 2017.pdf

Но при скачивании этого файла с этого же WebUI браузером себе локально, он имеет нормальное имя - “ВОДНЫЙ КОДЕКС 2017.pdf”

Его можно как-то получить с той строки? Библиотека chardet не хочет помогать, либо не умею пользоваться



———————————————————————————
Мой блог о семействе *nix: http://nixtravelling.blogspot.com/

Офлайн

#7 Ноя. 2, 2017 00:23:31

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9873
Репутация: +  853  -
Профиль   Отправить e-mail  

Как передать файл через post с именем в юникоде?

  
>>> s = u'\xd0\x92\xd0\x9e\xd0\x94\xd0\x9d\xd0\xab\xd0\x99 \xd0\x9a\xd0\x9e\xd0\x94\xd0\x95\xd0\x9a\xd0\xa1 2017.pdf'
>>> s
u'\xd0\x92\xd0\x9e\xd0\x94\xd0\x9d\xd0\xab\xd0\x99 \xd0\x9a\xd0\x9e\xd0\x94\xd0\x95\xd0\x9a\xd0\xa1 2017.pdf'
>>> s.encode('latin1').decode('utf-8')
u'\u0412\u041e\u0414\u041d\u042b\u0419 \u041a\u041e\u0414\u0415\u041a\u0421 2017.pdf'
>>> out = s.encode('latin1').decode('utf-8')
>>> print out
ВОДНЫЙ КОДЕКС 2017.pdf
>>>



Офлайн

#8 Ноя. 2, 2017 09:49:31

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2750
Репутация: +  184  -
Профиль   Отправить e-mail  

Как передать файл через post с именем в юникоде?

> Библиотека chardet не хочет помогать, либо не умею пользоваться

А ты пытался?
http://wiki.python.su/%D0%9F%D0%B0%D0%BA%D0%B5%D1%82%D1%8B/Python/Chardet



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#9 Ноя. 2, 2017 12:05:15

Master_Sergius
Зарегистрирован: 2013-09-12
Сообщения: 271
Репутация: +  7  -
Профиль   Отправить e-mail  

Как передать файл через post с именем в юникоде?

Я пошел извращенным путём:

 s = u'\xd0\x92\xd0\x9e\xd0\x94\xd0\x9d\xd0\xab\xd0\x99 \xd0\x9a\xd0\x9e\xd0\x94\xd0\x95\xd0\x9a\xd0\xa1 2017.pdf'
>>> repr(s)
"u'\\xd0\\x92\\xd0\\x9e\\xd0\\x94\\xd0\\x9d\\xd0\\xab\\xd0\\x99 \\xd0\\x9a\\xd0\\x9e\\xd0\\x94\\xd0\\x95\\xd0\\x9a\\xd0\\xa1 2017.pdf'"
>>> repr(s)[2:-1]
'\\xd0\\x92\\xd0\\x9e\\xd0\\x94\\xd0\\x9d\\xd0\\xab\\xd0\\x99 \\xd0\\x9a\\xd0\\x9e\\xd0\\x94\\xd0\\x95\\xd0\\x9a\\xd0\\xa1 2017.pdf'
>>> repr(s)[2:-1].decode('string_escape')
'\xd0\x92\xd0\x9e\xd0\x94\xd0\x9d\xd0\xab\xd0\x99 \xd0\x9a\xd0\x9e\xd0\x94\xd0\x95\xd0\x9a\xd0\xa1 2017.pdf'
>>> repr(s)[2:-1].decode('string_escape').decode('utf-8')
u'\u0412\u041e\u0414\u041d\u042b\u0419 \u041a\u041e\u0414\u0415\u041a\u0421 2017.pdf'
>>> print repr(s)[2:-1].decode('string_escape').decode('utf-8')
ВОДНЫЙ КОДЕКС 2017.pdf

В конце концов решил, что пусть имя файла остается порченным, главное, что теперь отсылается. А там кто знает, как люди ещё файлы сохраняют в своих базах, эти имена с контентом достаются через API



———————————————————————————
Мой блог о семействе *nix: http://nixtravelling.blogspot.com/

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version