Имя: Пароль:
1C
1С v8
Новый HTTPСоединение: записать произвольные данные в файл.
0 Sevish
 
21.10.22
08:39
Добрый день всем!
Есть некий http который на своей стороне читает данные какого-то файла (любого).

&НаСервере
Я получаю эти данные через "СтрокаОтвета = HTTPОтвет.ПолучитьТелоКакСтроку();".
Если это данные текстовые (*.xml, 8.txt и т. п.) - проблем нет: создаю новый текстовый файл, сохраняю во временный, читаю, помещаю в хранилище и возвращаю адрес хранилища.
&НаКлиенте
Получаю из хранилища, записываю в каталог, который выбрал пользователь.

Пользователь открывает файл и все видит. Все отлично!

Но если сервис возвращает содержимое файла *.pdf, что делать?
Пробовал так же запихать э\то в текстовый файл - не помогло. Видимо есть какие-то нечитаемые символы и файл получается обрезанным.
Пробовал использовать "ПолучитьТелоКакДвоичныеДанные()", но тогда и текстовый и любой файл после записи выглядит как: "AB 2F...".

Задачу можно сформулировать так: не важно что вернул сервис, нужно это записать в файл в том виде, в котором он вернул.
Пожалуйста, помогите.
1 arsik
 
гуру
21.10.22
09:23
(0) Двоичные данные смотри. Тебе же сервер двоичные данные возвращает, а не текстовые. И в первом варианте на двоичные переделай.
2 sikuda
 
21.10.22
09:45
ДвоичныеДанные.Записать(<ИмяФайла>)
3 sikuda
 
21.10.22
09:53
В ответах сервера заголовок Content-Type сообщает клиенту, какой будет тип передаваемого контента. В некоторых случаях браузеры пытаются сами определить MIME тип передаваемого контента, но их реакция может быть неадекватной. Чтобы предотвратить такие ситуации, вы можете установить в заголовке X-Content-Type-Options значение nosniff

1. Content-Type: text/html; charset=utf-8
2. Content-Type: multipart/form-data; boundary=something
4 lodger
 
21.10.22
09:53
и ещё добавлю, ДД не надо записывать на сервере. их надо сразу во временная хранилище совать, чтобы клиент их забрал. без промежуточной записи в файлы.
5 Sevish
 
21.10.22
11:16
Получил содержимое "ПолучитьТелоКакДвоичныеДанные()" (текст. *.xml внутри), сразу поместил во временное хранилище, получил &НаКлиенте и "ДвоичныеДанные.Записать". В результате внутри файла: "3C 3F 78 6D 6C 20 76 65 72 73 69 6F 6E 3D 22 31 2E 30 22 20 65 6E 63 6F 64 69 6E 67 3D 22 77 69 6E 64 6F 77 73 2D 31 32 35 31 22 3F 3E 0D 0A 3C D4 E0 E9 EB 20 C8 E4 D4 E0 E9 EB 3D 22 4F 4E 5F 4E 53 43 48 46 44 4F 50 50 52 5F 32 42 4D 2D 35 34 30 37 30 32 35 35 37 36 2D 32 30 31 32 30 35 32 38 30 38 33 37 32 36 35 38 37 30 32 36 33 30 30 30 30 30 30 30 30 30 30 5F 32 42 4D 2D 37 30 31 37 33 37 33 39 35 39 2D 37 30 31 37 30 31 30 30 31 2D 32 30 31 35 30 34 32 39 30 38 35 33 31 32 31 38 32 30 39 35 36 5F 32 30 32 32 31 30 32 30 5F 62 34 61 62 32 64 65 64 2D 30 31 66 66 2D 34 35 63 33 2D 62 62 61 31 2D 37 64 38 66 32 62 63 66 66 35 33 65 22 20 C2 E5 F0 F1 D4 EE F0 EC 3D 22 35 2E 30 31 22 20 C2 E5 F0 F1 CF F0 EE E3 3D 22 44 69 61 64 6F 63 20 31 2E 30 22 3E 0D 0A...".
У "HTTPОтвет" такие свойства:
"Date"                "Fri, 21 Oct 2022 08:13:06 GMT"
"X-Download-Options"        "noopen"
"Connection"            "close"
"X-AspNet-Version"        "4.0.30319"
"Content-Disposition"        "attachment; filename*=UTF-8''ON_NSCHFDOPPR_2BM-5407025576-2012052808372658702630000000000_2BM-7017373959-701701001-201504290853121820956_20221020_b4ab2ded-01ff-45c3-bba1-7d8f2bcff53e.xml; filename=ON_NSCHFDOPPR_2BM-5407025576-2012052808372658702630000000000_2BM-7017373959-701701001-201504290853121820956_20221020_b4ab2ded-01ff-45c3-bba1-7d8f2bcff53e.xml"
"X-Powered-By"            "ASP.NET"
"Server"            "Microsoft-IIS/10.0"
"Cache-Control"            "no-cache"
"Content-Length"        "5357"
"Content-Type"            "application/octet-stream"
6 lodger
 
21.10.22
11:37
(5) ДвоичныеДанные.Записать а файл как назвал?
7 Sevish
 
21.10.22
12:00
НовыйФайл.tmp - просто произвольное имя. Это же пока тренировка.
8 Sevish
 
21.10.22
12:05
Пересохранил "НовыйФайл.xml" - тот же результат.
9 Галахад
 
гуру
21.10.22
12:07
Т.е. ты не знаешь заранее тип получаемого файла?
10 Kassern
 
21.10.22
12:17
(0) Попробуйте
ДД=Base64Значение(ВашаСтрокаСДанными);
ДД.Записать("ПутьДоФайлаСНужнымРасширением");
11 Sevish
 
21.10.22
12:24
(10) А "ВашаСтрокаСДанными" что должна содержать? Двоичные данные и строку как строку?
(9) - да НЕ знаю, только косвенно, исходя из расширения файла. Но допустим, сегодня это xml и pdf, а завтра doc прилетит, не менять же код? :)
12 lodger
 
21.10.22
12:27
(11)  ДД=Base64Значение(ПолучитьТелоКакДвоичныеДанные())
13 lodger
 
21.10.22
12:28
(11) не менять же код. транспорт один и тот же, протокол тот же. вопрос только "чем открыть?".
подсказка есть в "Content-Disposition"
14 KJlag
 
21.10.22
12:32
а попросить чтобы отправляли данные в джейсуне нельзя?
и в джейсунь уже запихивать расширение, двоичные данные\base64
15 lodger
 
21.10.22
12:34
(14) тело в пакет(json), завернуть ещё в пакет(http). зачем? всё и так работает.
16 Sevish
 
21.10.22
16:57
(14) Прав, но не в том смысле, чтобы в JSON паковать, а в том, что скорее всего ошибка в методе. Задал вопрос разработчику, он сказал что возвращаются двоичные данные, но я  PostMan вижу, что возвращается строка. На следующей неделе буду разбираться. Благодарю всех за наводки. В вообще в итоге все получилось через "Поток". Все записывается, но открывается только текстовые файлы, pdf, например. открывается, но пустой, хотя размер не нулевой.
17 Kassern
 
21.10.22
17:00
(16) "PostMan вижу, что возвращается строка" - а что должно возвращаться??) Только строки и возвращаются. "3C 3F 78 6D 6C 20 76 65 72 73 69 6F 6E 3D 22 31 2E 30 22 20 65 6E 63 6F 64 69 6E 67 3D 22..." - это тоже строка, json/xml в теле ответа - это тоже строка.
18 Kassern
 
21.10.22
17:00
То что вы ответ из тела собираете в двоичные данные и записываете, не отменяет, что изначально вы получаете строку с данными.
19 Sevish
 
21.10.22
17:02
(17) любой файл *.pdf если в Notepad открыть - вот это и вижу, а должно быть "3C 3F 78 6D 6C..."
20 Kassern
 
21.10.22
17:04
(19) У меня где-то был кусок кода с получением pdf файла с этикеткой по API и сохранением в базу. Если интересно, то гляну вечерком кусок кода.
21 Sevish
 
21.10.22
17:07
Прикол в том, что я могу в обход этого http-сервиса просто по прямому URL получить этот файл и сохранить. Такая процедура есть у меня, она работает. Но задача стоит использовать этот метод. Так что код по API не поможет, увы. Кстати. посмотрел описание обратного метода (поместить туда файл), так там я передаю бинарный массив. по логике он и тут должен возвращаться. так что все же видимо в сервисе ошибка.
22 big
 
21.10.22
18:42
Во-во!! Не далее, как сегодня же получал такие же данные с Диадока. Но там честно написали, что возвращают контент в Base64, а посему проблем не было. Вот с pdf и неформализованными документами пока не стал разбираться (там какой-то треш внутрях), ибо не надоть))

з.ы. но мне чем то проще, у меня 7.7. ;)
23 ДедМорроз
 
22.10.22
09:11
А разве при запросе нельзя указать файл для записи ?
24 Hmster
 
22.10.22
10:20
HTTPСоединение (HTTPConnection)
Получить (Get)
Синтаксис:
Получить(<HTTPЗапрос>, <ИмяВыходногоФайла>)
Параметры:
<HTTPЗапрос> (обязательный)
Тип: HTTPЗапрос.
HTTP-запрос.
<ИмяВыходногоФайла> (необязательный)
Тип: Строка.
Имя файла, в который помещаются данные полученного ресурса. Если не указан или содержит пустую строку, то тело ответа может быть получено из объекта HTTPОтвет.
Возвращаемое значение:
Тип: HTTPОтвет.
25 Hmster
 
22.10.22
10:22
(24) то то сервер вернул - записывается в файл само если указать имя входного файла
26 ДедМорроз
 
22.10.22
11:19
Просто,на телефоне открыть СП тяжело.
А изобретали велосипеда всегда пугали.
27 lodger
 
24.10.22
10:25
(26) (25) работа с ДД в оперативке без применения FileStream это немножко не велосипед.