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