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