Доброго времени суток. Пытаюсь через IdMultipartFormData.AddFile отправить на сайт файл с русским названием, но не получается. Сниффер показывает, что имя файла отправляется в кодировке utf-8, но как ее указать в функции AddFile не знаю.
делай не через AddFile, а через AddObject, там есть возможность указать кодировку. просмотри все перегруженные версии этого метода.
xophet, попробовал перегруженную функцию AddFormField: Code: fs:=TFileStream.Create(filename, fmOpenRead); FormData.AddFormField('userfile', 'multipart/form-data', 'utf-8', fs, ExtractFileName(filename)).ContentTransfer:='8bit'; Файл отправляется, но все равно та же проблема с кодировкой. И еще один нюанс - на сайте имя файла в непонятной кодировке: "=?KOI8-R?B?xsHKzA==?=.zip", а сниффер при отправке файла вручную показывает имя файла в utf-8: "файл.zip"
xophet, вот я и не понимаю, почему на сайте фиг знает что, а сниффер показывает, что файл отправляется в utf-8 Полазив по гуглу, я понял, что в KOI-8?r?b буква b означает кодирование алгоритмом base64. В IdMultiPartFormData.pas нашел: Code: LHeaderEncoding := 'B'; { base64 / quoted-printable } заменил здесь букву B на 8, теперь на сайт отправляется такое имя файла: "????". Я так понял название нужно кодировать в utf-8. Но функция AddFormField (которая перегруженная), не хочет понимать параметры Charset и ContentTransfer - все равно отправляются знаки вопроса. Как можно закодировать имя файла в utf-8?
пробовал (через компонент IdEncodeMIME) и ставил ContentTransfer:='base64' , но все равно имя файла отправляется как koi8?r?b.
Если с кодированием в base64 (как было раньше), то получается "koi8?r?b...", если убрать base64, то "????". Я думаю, что нужно в самом компоненте покопаться. Если я правильно понял, то кодирование имени файла происходит в этом куске кода: Code: if Length(FileName) > 0 then begin Result := Result + IndyFormat(sFileNamePlaceHolder, [EncodeHeader(FileName, '', LHeaderEncoding, LCharSet)]); {do not localize} end;
Вы слегка не поняли что я хочу. поля "charset" и "encoding" оставьте пустыми, а вместо имени файла сделайте Code: "UTF8Encode('ИМЯ_ФАЙЛА')" а Indy у Вас свеженький?
Так вот в чем дело... Проверил сейчас на произвольном тексте функцию UTF8Encode. Возвращает ту же русскую строку... все это делаю в D2010.
Обратился на оф. форум Инди, помогли. Добавили свойства "HeaderCharset" и "HeaderEncoding" и обновили его на SVN. Использовать так: Code: with FormData.AddFormField('userfile', 'application/octet-stream', '', fs, 'файл.zip') do begin HeaderCharset := 'utf-8'; HeaderEncoding := '8'; end;