Имя: Пароль:
1C
1С v8
Не видит кириллицу в имени при передаче файла по http
0 Кицум
 
25.08.21
14:22
Доброго времени суток!

Передаю файл с параметрами на сторонний API. Если имя файла на латинице, то все ОК, если на кириллице, то 2 варианта: а) имя из одного слова, тогда на сайт загружается файл без имен ".pdf"; б) если из нескольких слов, тогда 404 ошибка и ничего не загружается.

Из постмана файл с кириллицей грузится нормально, при этом, если фидлером смотреть, то из постмана filename="Прием на работу 0000-000001 от 16.08.2021г.pdf". А если из 1Ски, то filename="C:\<не читаемые символы>.pdf". Что-то с кодировкой? Из постмана в заголовке еще передаются

Accept-Encoding: gzip, deflate, br

Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7

пробовал по аналогии сделать в 1Ске, но все та же 404, правда в возвращать стала тоже нечитаемые символы.

Что с этим всем делать?


Код:
    ИмяФайлаОтправки = КаталогВременныхФайлов() + "post.txt";    
    ИмяФайлаДляЗагрузки = "C:\прием на работу.pdf";
    
    Сервер = "new.хххх.kz";
    Подключение = Новый Структура ("HTTP, ЗаголовокHTTP, Адрес" );    
    Подключение.Адрес = "/api/explorer/file";
    
    HTTP = Новый HTTPСоединение(Сервер,,,,,,Новый ЗащищенноеСоединениеOpenSSL);
    
    Boundary = Строка(Новый УникальныйИдентификатор());

    //Определяем массив для процедуры ОбъединитьФайлы
    МассивФайловДляОбъединения = Новый Массив;

    //Формируем начальный фрагмент файла POST-запроса
    ИмяФайлаОтправкиНачало = ПолучитьИмяВременногоФайла("txt");
    ФайлОтправкиНачало = Новый ЗаписьТекста(ИмяФайлаОтправкиНачало, КодировкаТекста.ANSI, Символы.ПС, Ложь);
    //Определяем раздел двоичных данных
    
    // параметр "json"
    ФайлОтправкиНачало.ЗаписатьСтроку("--"+boundary);
    ФайлОтправкиНачало.ЗаписатьСтроку("Content-Disposition: form-data; name=""json""");
    ФайлОтправкиНачало.ЗаписатьСтроку("");
    ФайлОтправкиНачало.ЗаписатьСтроку("{}");
    
    // параметр "type"
    ФайлОтправкиНачало.ЗаписатьСтроку("--"+boundary);
    ФайлОтправкиНачало.ЗаписатьСтроку("Content-Disposition: form-data; name=""type""");
    ФайлОтправкиНачало.ЗаписатьСтроку("");
    ФайлОтправкиНачало.ЗаписатьСтроку("File1c");
    
    // параметр "parent_uuid"
    ФайлОтправкиНачало.ЗаписатьСтроку("--"+boundary);
    ФайлОтправкиНачало.ЗаписатьСтроку("Content-Disposition: form-data; name=""parent_uuid""");
    ФайлОтправкиНачало.ЗаписатьСтроку("");
    ФайлОтправкиНачало.ЗаписатьСтроку("93bd929f-6ec3-4888-bd6b-3964aff2e9a4");
    
    // сам файл
    ФайлОтправкиНачало.ЗаписатьСтроку("--"+boundary);
    //Указываем имя файла для передачи        
    ФайлОтправкиНачало.ЗаписатьСтроку("Content-Disposition: form-data; name=""file""; filename=""" + ИмяФайлаДляЗагрузки + """");
    //Указываем тип передаваемых данных.
    ФайлОтправкиНачало.ЗаписатьСтроку("Content-Type: application/pdf");
    ФайлОтправкиНачало.ЗаписатьСтроку("");
    ФайлОтправкиНачало.Закрыть();

    МассивФайловДляОбъединения.Добавить(ИмяФайлаОтправкиНачало);

    //Копируем файл для загрузки во временный и добавляем в массив файлов для объединения
    ИмяФайлаДляЗагрузкиВременный = ПолучитьИмяВременногоФайла("tmp");
    КопироватьФайл(ИмяФайлаДляЗагрузки, ИмяФайлаДляЗагрузкиВременный);
    МассивФайловДляОбъединения.Добавить(ИмяФайлаДляЗагрузкиВременный);

    //Формируем конечный фрагмент файла POST-запроса
    ИмяФайлаОтправкиКонец = ПолучитьИмяВременногоФайла("txt");
    
    ФайлОтправкиКонец = Новый ЗаписьТекста(ИмяФайлаОтправкиКонец, КодировкаТекста.ANSI, Символы.ПС, Ложь);
    
    //Завершение раздела двоичных данных
    
    ФайлОтправкиКонец.ЗаписатьСтроку("");
    ФайлОтправкиКонец.ЗаписатьСтроку("--" + Boundary + "--");
    ФайлОтправкиКонец.Закрыть();
    
    МассивФайловДляОбъединения.Добавить(ИмяФайлаОтправкиКонец);

    //Теперь сформированные фрагменты сообщения для сервера объединяем в один файл POST-запроса
    ОбъединитьФайлы(МассивФайловДляОбъединения, ИмяФайлаОтправки);    
    Заголовки = Новый Соответствие();
    Заголовки.Вставить("Content-Type", "multipart/form-data; boundary=" + Boundary);
    Заголовки.Вставить("Authorization", "Bearer "+ "токен");
    Заголовки.Вставить("Accept", "aapplication/json; charset=utf-8");
    Заголовки.Вставить("workspace-id", "52185");
  
    HHTPЗапрос = Новый HTTPЗапрос(Подключение.Адрес, Заголовки);
    HHTPЗапрос.УстановитьИмяФайлаТела(ИмяФайлаОтправки);    

    HTTPОтвет = HTTP.ОтправитьДляОбработки(HHTPЗапрос);
    ТекстОтвета = HTTPОтвет.ПолучитьТелоКакСтроку();
    Сообщить(ТекстОтвета);
1 ДенисЧ
 
25.08.21
14:29
Это потому, что интернет делали неруси-русофобы.
2 Garykom
 
гуру
25.08.21
14:29
(0) filename=""" + ИмяФайлаДляЗагрузки + """"

тут надо правильную кодировку
3 Garykom
 
гуру
25.08.21
14:30
(1) С теми кто делали все ок
Это с кто юзает не так как делали проблема
4 Asmody
 
25.08.21
14:30
5 acht
 
25.08.21
14:32
(3) Это с кто юзает не так как делали
Согласно https://www.ietf.org/rfc/rfc2183.txt там вообще должна быть только латиница:

   Current [RFC 2045] grammar restricts parameter values (and hence
   Content-Disposition filenames) to US-ASCII.  We recognize the great
   desirability of allowing arbitrary character sets in filenames, but
   it is beyond the scope of this document to define the necessary
   mechanisms.  We expect that the basic [RFC 1521] `value'
   specification will someday be amended to allow use of non-US-ASCII
   characters, at which time the same mechanism should be used in the
   Content-Disposition filename parameter.
6 Garikk
 
25.08.21
14:33
(0) https://stackoverflow.com/questions/93551/how-to-encode-the-filename-parameter-of-content-disposition-header-in-http
попробуй тут во втором ответе что советуют
7 acht
 
25.08.21
14:33
Все остальное - по воле божь... браузерной
8 Garikk
 
25.08.21
14:37
(5) погоди погоди сразу дремучие стандарты цитировать, ты все rfc посмотрел? там гдето есть RFC2047 MIME (Multipurpose Internet Mail Extensions) Part Three:
              Message Header Extensions for Non-ASCII Text
9 Garikk
 
25.08.21
14:37
а оттуда еще десяток rfc по правилам формирования content disposition
10 Garykom
 
гуру
25.08.21
14:38
Если 1С 8 использует движок вебкит то по логике тупо UTF8 туда символы
11 Garikk
 
25.08.21
14:38
97 год всётаки, а русскоязычные файлы давным давно можно стало отправлять по http
12 acht
 
25.08.21
14:40
(8) https://www.ietf.org/rfc/rfc2047.txt

   + An 'encoded-word' MUST NOT be used in parameter of a MIME
     Content-Type or Content-Disposition field, or in any structured
     field body except within a 'comment' or 'phrase'.
13 Garykom
 
гуру
25.08.21
14:55
(7) причем тут браузер когда сервер должен понимать
а клиент HTTPСоединение в 1С
14 Garykom
 
гуру
25.08.21
14:55
(13)+ гуглить хорошо умеем а вот думать не очень
15 acht
 
25.08.21
14:56
(13) "клиентского агента" так тебе понятней будет, думать получится?
16 Кицум
 
26.08.21
07:04
(2) да, победил с помощью

Стр = "Кодируемый текст";
    Стрим = Новый COMОбъект("Adodb.Stream");
    Стрим.Type = 2;
    Стрим.Mode= 3;
    Стрим.charset="utf-8";
    Стрим.Open();
    Стрим.WriteText(Стр);
    Стрим.Position=0;
    Стрим.charset="windows-1251";
    Рез=Стрим.ReadText(-1);
    Стрим.Close();
17 Garykom
 
гуру
26.08.21
09:09
(16) рука-лицо
18 maximkasuper
 
26.08.21
15:26
(0) Используйте метод КодироватьСтроку().
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн