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