Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Сохранение Stream PDF в файл

Сохранение Stream PDF в файл
Я
   Кицум
 
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 - результат не изменился. Что нужно указать?
   Почему 1С
 
3 - 02.08.21 - 08:44
(2) Что в ответе в  Content-Type лежит?
   acht
 
4 - 02.08.21 - 08:51
(0) А HTTP код ответа проверять Александр Сергеевич будет?
Открой полученный файл блокнотом и посмотри, что внутри. Вангую, что там html.
   acht
 
5 - 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
   acht
 
9 - 02.08.21 - 09:10
(8) Postman умеет сохранять тело ответа на диск?
   Кицум
 
10 - 02.08.21 - 09:14
(9) Только что попробовал, если из Postmanа сохранить ответ, то он сохраняет файл с невнятным расширением ".1c", в с тем же самым содержимым, что и у меня получается...
   Кицум
 
11 - 02.08.21 - 09:16
файлы по размеру идентичны и совпадают с оригинальным PDF-ником, который я до этого грузил на сервис
   Почему 1С
 
12 - 02.08.21 - 09:19
(8) Возможно проблемы с кодировкой сохранения, так как в теле у тебя действительно лежит готовый файл pdf
   Почему 1С
 
13 - 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
   Почему 1С
 
15 - 02.08.21 - 09:44
(14) хм, а если оставить только в конце файла %%EOF откроется?
   Почему 1С
 
16 - 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 и файл действительно открылся! И что с этим дальше делать?))
   acht
 
19 - 02.08.21 - 11:00
(17) Сохрани файл на диск и откуси от него последние 39 или сколько там байт. Обработка за 5 минут пишется. Если полученный файл открывается, то вопрос к серверу и к постману - почему один отдает данные как мультипарт/формдата, а второй показывает что это аппликейшн/пдф
   Garykom
 
20 - 02.08.21 - 11:01
HTTPСоединение (HTTPConnection)
ОтправитьДляОбработки (Post)
Синтаксис:
ОтправитьДляОбработки(<HTTPЗапрос>, <ИмяВыходногоФайла>)
Параметры:
<HTTPЗапрос> (обязательный)
Тип: HTTPЗапрос.
HTTP-запрос.
<ИмяВыходногоФайла> (необязательный)
Тип: Строка.
Имя выходного файла, в который записываются полученные с сервера данные.
Если не указан или содержит пустую строку, то тело ответа может быть получено из объекта HTTPОтвет.
Возвращаемое значение:
Тип: HTTPОтвет.
Описание:
Отправляет данные на указанный адрес для обработки при помощи HTTP-запроса POST.
Доступность:
Тонкий клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
Пример:
   acht
 
21 - 02.08.21 - 11:02
(20)
1) У него GET.
2) Микросервис на GO поднимать не требуется
   Garykom
 
22 - 02.08.21 - 11:02
(20)(21) у GET и ВызватьHTTPМетод тоже есть ИмяВыходногоФайла
   Кицум
 
23 - 02.08.21 - 11:12
Ответ =  HTTPОтвет.ПолучитьТелоКакДвоичныеДанные();
 Ответ.Записать("D:\3.pdf");

и

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

срабатывают одинаково и без удаления концовки не открываются
   Garykom
 
24 - 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, то открывается и хромом и акробатом.
   Garykom
 
26 - 02.08.21 - 11:40
(25) покажи заголовки ответа
   Garykom
 
27 - 02.08.21 - 11:41
(26) конкретно Content-Length
   Кицум
 
28 - 02.08.21 - 12:22
Content-Length 126158
   Garykom
 
29 - 02.08.21 - 12:23
(28) и? сравни с длиной в файле что получил?

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


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.