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