Имя: Пароль:
1C
1С v8
Сохранение Stream PDF в файл
0 Кицум
 
02.08.21
07:49
Добрый день.
GET запросом забираю PDF файл с сервиса, файл забирается в виде Stream. Не могу его нормально сохранить на диск после этого:

АдресСтраницы = "/api/explorer/file/93ec3425-af18-4cab-b0a3-5b55e80a859a?type=File1c";

    Соединение = Новый HTTPСоединение("new.NNN.kz",443,,,,,Новый ЗащищенноеСоединениеOpenSSL());
    
                                    
    Заголовки = Новый Соответствие();
    Заголовки.Вставить("Authorization", "Bearer "+ "МойТокен");
    Заголовки.Вставить("Content-Type", "application/json");
    Заголовки.Вставить("Accept", "application/json");
    Заголовки.Вставить("workspace-id", "52185");

    
    
    Запрос = Новый HTTPЗапрос(АдресСтраницы, Заголовки);
    HTTPОтвет = Соединение.Получить(Запрос);
    Ответ =  HTTPОтвет.ПолучитьТелоКакДвоичныеДанные();
    Ответ.Записать("D:\3.pdf");

Файл сохраняется, но не читается после сохранения.
  
Пробовал через COMОбъект("ADODB.Stream"). Результат идентичен: файлы по содержимому одинаковы и Adobe reader считает, что они повреждены
  
Если делать запрос в Postmane, то в теле виден открытый PDF-ник. Т.е. сам файл не поврежден изначально
1 Почему 1С
 
02.08.21
08:04
(0) Content-Type application/json - а хочешь получить бинарный стрим?
2 Кицум
 
02.08.21
08:16
(1) Так прописаны заголовки в документации к API. Попробовал application/octet-stream и application/pdf - результат не изменился. Что нужно указать?
3 Почему 1С
 
02.08.21
08:44
(2) Что в ответе в  Content-Type лежит?
4 acht
 
02.08.21
08:51
(0) А HTTP код ответа проверять Александр Сергеевич будет?
Открой полученный файл блокнотом и посмотри, что внутри. Вангую, что там html.
5 acht
 
02.08.21
08:58
(1) Content-Type - это описание того, что отправляет клиент, хрен с ним при GET.
А вот зачем у него Accept: application/json - это большой вопрос, да
6 Кицум
 
02.08.21
09:00
(5) (4) Код ответа 200, в блокноте: 倥䙄ㄭ㜮┊膁膁ਊ㐱〠漠橢㰊਼䰯湥瑧ㅨ㜠ㄹ㘳⼊楆瑬牥⼠汆瑡䑥捥摯੥䰯湥瑧⁨㈳㔰ਹ㸾猊牴慥੭鱸뷬簇䕔㿷晼�뮖蒡...
Если использовать ПолучитьТелоКакСтроку(), то там:

%PDF-1.7
%����

14 0 obj
<<
/Length1 79136
/Filter /FlateDecode
/Length 32059
>>
stream
x��|TE�?|fnݖ����nJ(!t���    "�    ��*������ ��(���%A�)�T� �F��g�.�Xx���{���y?I��;3g�̙�3g��bD�i�Pָ�F�Sz�x�h\<Q�/��n��{�=LL?D�(纡����WDĐN�ko>TY��D3�uh5� ...
7 Кицум
 
02.08.21
09:00
(5) менял, убирал вообще - не влияет на результат
8 Кицум
 
02.08.21
09:04
(3) Postman говорит, что там лежит application/pdf
9 acht
 
02.08.21
09:10
(8) Postman умеет сохранять тело ответа на диск?
10 Кицум
 
02.08.21
09:14
(9) Только что попробовал, если из Postmanа сохранить ответ, то он сохраняет файл с невнятным расширением ".1c", в с тем же самым содержимым, что и у меня получается...
11 Кицум
 
02.08.21
09:16
файлы по размеру идентичны и совпадают с оригинальным PDF-ником, который я до этого грузил на сервис
12 Почему 1С
 
02.08.21
09:19
(8) Возможно проблемы с кодировкой сохранения, так как в теле у тебя действительно лежит готовый файл pdf
13 Почему 1С
 
02.08.21
09:23
(6) Последняя строчка файла какая?
14 Кицум
 
02.08.21
09:35
(13) stream
x�-̹
�@C�?�7� �2D4�1�
D1D�E��2��D0�4�X&2���e!KY�Z6�y�?[���X֯��N��8�Ӈ�R{o��� �
endstream
endobj

startxref
125860
%%EOF--bec04134-9487-484c-9995-79cd9bb0803c
15 Почему 1С
 
02.08.21
09:44
(14) хм, а если оставить только в конце файла %%EOF откроется?
16 Почему 1С
 
02.08.21
09:50
(14) Ну только hex редактором естественно
17 Кицум
 
02.08.21
10:55
(15) не совсем понял суть: данные вида (6)  получаются, если я делаю ПолучитьТелоКакСтроку(). Т.е. это текст. Мне нужно сохранить этот текст как pdf? Это же не сработает. Если я сохраняю через двоичные данные, то файлик в блокноте уже выглядит как иероглифы.
18 Кицум
 
02.08.21
10:59
хм, открыл hex редактором файл, сохраненный через

  Ответ =  HTTPОтвет.ПолучитьТелоКакДвоичныеДанные();
  Ответ.Записать("D:\3.pdf");

убрал --bec04134-9487-484c-9995-79cd9bb0803c и файл действительно открылся! И что с этим дальше делать?))
19 acht
 
02.08.21
11:00
(17) Сохрани файл на диск и откуси от него последние 39 или сколько там байт. Обработка за 5 минут пишется. Если полученный файл открывается, то вопрос к серверу и к постману - почему один отдает данные как мультипарт/формдата, а второй показывает что это аппликейшн/пдф
20 Garykom
 
гуру
02.08.21
11:01
HTTPСоединение (HTTPConnection)
ОтправитьДляОбработки (Post)
Синтаксис:
ОтправитьДляОбработки(<HTTPЗапрос>, <ИмяВыходногоФайла>)
Параметры:
<HTTPЗапрос> (обязательный)
Тип: HTTPЗапрос.
HTTP-запрос.
<ИмяВыходногоФайла> (необязательный)
Тип: Строка.
Имя выходного файла, в который записываются полученные с сервера данные.
Если не указан или содержит пустую строку, то тело ответа может быть получено из объекта HTTPОтвет.
Возвращаемое значение:
Тип: HTTPОтвет.
Описание:
Отправляет данные на указанный адрес для обработки при помощи HTTP-запроса POST.
Доступность:
Тонкий клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
Пример:
21 acht
 
02.08.21
11:02
(20)
1) У него GET.
2) Микросервис на GO поднимать не требуется
22 Garykom
 
гуру
02.08.21
11:02
(20)(21) у GET и ВызватьHTTPМетод тоже есть ИмяВыходногоФайла
23 Кицум
 
02.08.21
11:12
Ответ =  HTTPОтвет.ПолучитьТелоКакДвоичныеДанные();
Ответ.Записать("D:\3.pdf");

и

Соединение.Получить(Запрос,"D:\3.pdf")

срабатывают одинаково и без удаления концовки не открываются
24 Garykom
 
гуру
02.08.21
11:24
(23)

АдресСтраницы = "/api/explorer/file/93ec3425-af18-4cab-b0a3-5b55e80a859a?type=File1c";
Соединение = Новый HTTPСоединение("new.NNN.kz",443,,,,,Новый ЗащищенноеСоединениеOpenSSL());

Заголовки = Новый Соответствие();
Заголовки.Вставить("Authorization", "Bearer "+ "МойТокен");
Заголовки.Вставить("workspace-id", "52185");

ФайлОтвет = ПолучитьИмяВременногоФайла();
Запрос = Новый HTTPЗапрос(АдресСтраницы, Заголовки);
Ответ = Соединение .Получить(Запрос, ФайлОтвет);  
    
Если Ответ.КодСостояния = 200 Тогда

КонецЕсли;
25 Кицум
 
02.08.21
11:37
(24) итог не меняется, правда заметил такой момент: хромом файл открывается, а акробатом - нет. Если убрать концовку после EOF, то открывается и хромом и акробатом.
26 Garykom
 
гуру
02.08.21
11:40
(25) покажи заголовки ответа
27 Garykom
 
гуру
02.08.21
11:41
(26) конкретно Content-Length
28 Кицум
 
02.08.21
12:22
Content-Length 126158
29 Garykom
 
гуру
02.08.21
12:23
(28) и? сравни с длиной в файле что получил?

может кривой веб-сервер отправляет лишние данные?
сильно вумный браузер или потсман режут а 1С отдает как есть?
30 acht
 
02.08.21
12:27
(28) Покажи все заголовки ответа. И пяток первых строк тела
31 Почему 1С
 
02.08.21
12:31
(18) Ну во первых с самим сервисом не мешало бы разобраться что он такое цепляет в ответе, если не вариант в 1С есть средства манипулирования двоичными данными на основании потоков, там можешь перед сохранением проверить что последние символы EOF и если нет обрезать лишние.
32 Кицум
 
02.08.21
12:40
(29)Длина изначального пдф-файла и пдф-файла, который вернул веб-сервер действительно отличается на эти самые 38 байт. Версия с кривым веб-сервисом и шибко умным хромом пока в приоритете).
33 Кицум
 
06.08.21
06:11
В общем, нашел причину: это была моя ошибка при отправке файла на сервис, в конце запроса я лишний boundary добавлял. Это он и записывался после EOF. Всем спасибо!