|
Не видит кириллицу в имени при передаче файла по 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) Используйте метод КодироватьСтроку().
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |