Найти - Пользователи
Полная версия: Как передать файл через post с именем в юникоде?
Начало » Python для экспертов » Как передать файл через post с именем в юникоде?
1 2
Master_Sergius
Но curl ведь отсылает. Да и на WebUI потом просматривать по имени файлов статистику удобно.
FishHook
Master_Sergius
Но curl ведь отсылает.
Тут наверняка вопрос кодировки, файл судя по расширению сделан в винде, в винде имена файлов в CP1251, curl вполне может конвертировать их в utf, а ваш скрипт этого скорее всего не делает. Поищите по справке, наверняка где-то этот вопрос решается.
vic57
может 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'
>>> 
py.user.next
Отправка
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.
Master_Sergius
Нашел вот такой выход (каноническая mime-кодировка):

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

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

 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 не хочет помогать, либо не умею пользоваться
py.user.next
  
>>> 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
>>>
Rodegast
> Библиотека chardet не хочет помогать, либо не умею пользоваться

А ты пытался?
http://wiki.python.su/%D0%9F%D0%B0%D0%BA%D0%B5%D1%82%D1%8B/Python/Chardet
Master_Sergius
Я пошел извращенным путём:

 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
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB