[Delphi] IdMultipartFormData русские символы в AddFile

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by name_00, 2 Nov 2011.

  1. name_00

    name_00 New Member

    Joined:
    30 May 2011
    Messages:
    25
    Likes Received:
    1
    Reputations:
    0
    Доброго времени суток. Пытаюсь через IdMultipartFormData.AddFile отправить на сайт файл с русским названием, но не получается. Сниффер показывает, что имя файла отправляется в кодировке utf-8, но как ее указать в функции AddFile не знаю.
     
  2. DYUMON

    DYUMON New Member

    Joined:
    15 Sep 2010
    Messages:
    68
    Likes Received:
    2
    Reputations:
    0
    попробуй название файла передавать как utf8encode('имяпорусски')
     
  3. name_00

    name_00 New Member

    Joined:
    30 May 2011
    Messages:
    25
    Likes Received:
    1
    Reputations:
    0
    DYUMON, нет, не выходит. Результат тот же...
     
  4. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    делай не через AddFile, а через AddObject, там есть возможность указать кодировку.
    просмотри все перегруженные версии этого метода.
     
  5. name_00

    name_00 New Member

    Joined:
    30 May 2011
    Messages:
    25
    Likes Received:
    1
    Reputations:
    0
    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"
     
    #5 name_00, 3 Nov 2011
    Last edited: 3 Nov 2011
  6. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    так файл на сайте не в UTF8
     
  7. name_00

    name_00 New Member

    Joined:
    30 May 2011
    Messages:
    25
    Likes Received:
    1
    Reputations:
    0
    xophet, вот я и не понимаю, почему на сайте фиг знает что, а сниффер показывает, что файл отправляется в utf-8 :confused:

    Полазив по гуглу, я понял, что в KOI-8?r?b буква b означает кодирование алгоритмом base64. В IdMultiPartFormData.pas нашел:

    Code:
    LHeaderEncoding := 'B';     { base64 / quoted-printable }
    заменил здесь букву B на 8, теперь на сайт отправляется такое имя файла: "????". Я так понял название нужно кодировать в utf-8. Но функция AddFormField (которая перегруженная), не хочет понимать параметры Charset и ContentTransfer - все равно отправляются знаки вопроса. Как можно закодировать имя файла в utf-8?
     
    #7 name_00, 3 Nov 2011
    Last edited: 4 Nov 2011
  8. name_00

    name_00 New Member

    Joined:
    30 May 2011
    Messages:
    25
    Likes Received:
    1
    Reputations:
    0
    помогите разобраться до конца... :rolleyes:
     
  9. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    а Вы не пробовали имя файла в Base64 закодировать, и отправить?
     
  10. name_00

    name_00 New Member

    Joined:
    30 May 2011
    Messages:
    25
    Likes Received:
    1
    Reputations:
    0
    пробовал (через компонент IdEncodeMIME) и ставил ContentTransfer:='base64' , но все равно имя файла отправляется как koi8?r?b.
     
  11. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    UTF8Encode когда на имени файла перед отправкой делаете, как отправляется?
     
  12. name_00

    name_00 New Member

    Joined:
    30 May 2011
    Messages:
    25
    Likes Received:
    1
    Reputations:
    0
    Если с кодированием в base64 (как было раньше), то получается "koi8?r?b...", если убрать base64, то "????". Я думаю, что нужно в самом компоненте покопаться. Если я правильно понял, то кодирование имени файла происходит в этом куске кода:
    Code:
      if Length(FileName) > 0 then begin
        Result := Result + IndyFormat(sFileNamePlaceHolder,
          [EncodeHeader(FileName, '', LHeaderEncoding, LCharSet)]);                 {do not localize}
      end;
    
     
    #12 name_00, 5 Nov 2011
    Last edited: 5 Nov 2011
  13. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    Вы слегка не поняли что я хочу. поля "charset" и "encoding" оставьте пустыми, а вместо имени файла сделайте
    Code:
    "UTF8Encode('ИМЯ_ФАЙЛА')"
    а Indy у Вас свеженький?
     
  14. name_00

    name_00 New Member

    Joined:
    30 May 2011
    Messages:
    25
    Likes Received:
    1
    Reputations:
    0
    Не, все равно "=?KOI8-R?B?xsHKzC56aXA=?=". Indy обновлял неделю назад.
     
  15. name_00

    name_00 New Member

    Joined:
    30 May 2011
    Messages:
    25
    Likes Received:
    1
    Reputations:
    0
    Так вот в чем дело... Проверил сейчас на произвольном тексте функцию UTF8Encode. Возвращает ту же русскую строку... все это делаю в D2010.
     
    #15 name_00, 5 Nov 2011
    Last edited: 5 Nov 2011
  16. mr_walker

    mr_walker Member

    Joined:
    9 Aug 2009
    Messages:
    41
    Likes Received:
    34
    Reputations:
    2
    AnsiToUtf8('русский текст');
     
  17. name_00

    name_00 New Member

    Joined:
    30 May 2011
    Messages:
    25
    Likes Received:
    1
    Reputations:
    0
    Обратился на оф. форум Инди, помогли. Добавили свойства "HeaderCharset" и "HeaderEncoding" и обновили его на SVN. Использовать так:
    Code:
     with FormData.AddFormField('userfile', 'application/octet-stream', '', fs, 'файл.zip') do
    begin
      HeaderCharset := 'utf-8';
      HeaderEncoding := '8';
    end;
     
    slavikzh likes this.