LINUX.ORG.RU

[Java] HttpClient и POST в UTF

 


0

0

На местном файлообменнике есть форма, через которую на оный заливаются файлы. Смотрю на POST-запрос в firebug'е и вижу следующее:

POST Request: (лишнее вырезал)

Accept-Language	en-us,en;q=0.5
Accept-Charset	UTF-8,*

Content-Type: multipart/form-data; boundary=---------------------------21303260151688634654156131092
Content-Length: 31952

-----------------------------21303260151688634654156131092
Content-Disposition: form-data; name="sfile"; filename="Комментарий.doc"
Content-Type: application/msword

......
Проблема в том, что когда делаю аналогичный POST через HttpClient, файлы с кириллическими именами на сервер заливаются с поломанными именами (вопросики вместо букв). Уже часа два и так и этак запрос переделываю, параметры всякие использую - не идет никак. Кто сталкивался подскажите.

А на файлопомойке точно в utf-8 имена хранятся?

>Accept-Charset UTF-8,*

Вот это вот выглядит как нечто дефолтное и пропустит любую кодировку.

shuthdar ★★★
()
Ответ на: комментарий от shuthdar

Думаю, решение в том, чтобы HttpClient отправлял эту строку в UTF-8 кодировке:

Content-Disposition: form-data; name="sfile"; filename="Комментарий.doc"
Но как это сделать я не знаю.

zahardzhan
() автор топика
Ответ на: комментарий от zahardzhan

>Думаю, решение в том, чтобы HttpClient отправлял эту строку в UTF-8 кодировке

Вроде бы по RFC-2047 (http://www.ietf.org/rfc/rfc2047.txt) имя файла надо преобразовывать.

Можно пропускать через, например, encodeText класса javax.mail.internet.MimeUtility.

ef37 ★★
()
Ответ на: комментарий от shuthdar

Поурлэнкодил в разные кодировки, в итоге в место просто вопросов имена на сайте стали такими:

"%CA%EE%EC%EC%E5%ED%F2"
"%D0%9A%D0%BE%D0%BC%D0%BC%D0%B5%D0%BD%D1%82"

zahardzhan
() автор топика
Ответ на: комментарий от zahardzhan

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

shuthdar ★★★
()
Ответ на: комментарий от shuthdar

Если поможет, вот код, которым я постю на файлообменник:

(let [#^HttpClient client (new HttpClient)
      #^File target-file (File. "/home/haru/какойто-файл")]
  (with-datacod-auth client "mymail@gmail.com" "passwd"
    (let [#^PostMethod file-post (PostMethod. "http://dsv.data.cod.ru/cabinet/upload/")
          parts (into-array Part
                            [(StringPart. "action"      "file_upload")
                             (FilePart.   "sfile"
                                          (URLEncoder/encode "какойто-файл" "UTF-8")
                                          target-file)
                             (StringPart. "agree"       "1")])]
      (doto file-post
        (.addRequestHeader "User-Agent" (user-agent))
        (.addRequestHeader "Accept-Charset" "UTF-8")
        (.addRequestHeader "Referer" "http://dsv.data.cod.ru/cabinet/upload/"))
      (try (.setRequestEntity file-post
                              (MultipartRequestEntity. parts (.getParams file-post)))
           (let [status (.executeMethod client file-post)]
             (when (= status 302)
               (.getName (first (.getElements (.getResponseHeader file-post "Location"))))))))))

zahardzhan
() автор топика
Ответ на: комментарий от zahardzhan

тут всё ок... попробуй подсмотреть кодировку на сайте и заэнкодить название в неё.

p.s. что за схемоподобная надстройка над джавой? понравилось :)

shuthdar ★★★
()
Ответ на: комментарий от shuthdar

На сайте используется UTF-8. Файлообменник - http://data.cod.ru.

Это новомодный лисп, http://clojure.org/. Функциональный, со встроенной транзакционной памятью, заточен под конкурентное программирование.

zahardzhan
() автор топика
Ответ на: комментарий от zahardzhan

И что странно, в питоне при использовании urllib2 строки типа

'\xd0\xba\xd0\xb0\xd0\xba\xd0\xbe\xd0\xb9\xd1\x82\xd0\xbe-\xd1\x84\xd0\xb 0\xd0\xb9\xd0\xbb'
вполне себе нормально работают.

zahardzhan
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.