![]() |
![]() |
![]() |
|
передача файла в 1С через http сервис 1с | ☑ | ||
---|---|---|---|---|
0
poyson
13.11.15
✎
11:18
|
Собственно проблема в следующем...
есть в конфигурации http-сервис. который генерит следующий текст html: <form enctype="multipart/form-data" method="post"> <p><input type="file" name="f"> <input type="submit" value="Отправить"></p> </form> Этот код позволяет выбрать, загрузить и передать в 1с файл в теле запроса. В полученной html форме народ выбирает файл и нажимает кнопку отправить... Но проблема в следующем... Передача файлов и др. бинарной информации возможна только с применением кодирования "multipart/form-data" а это кодирование предполагает хранение заголовков запроса и файла единым текстом с использованием разделителя. Http сервисы типа Php разбирают такой текст без проблем - стандартными языковыми структурами. Мой вопрос - как это сделать в 1С? |
|||
1
Fragster
гуру
13.11.15
✎
11:26
|
только разбирать руками, инфа 100%
|
|||
2
poyson
13.11.15
✎
11:35
|
(1) Проблема в скупости работы 1с с бинарными данными...
В ответе присутсвуют как текстовые разделители, так и бинарники... думаю ничего не выдет. придется отказаться от мысли реализовать загрузку прямо в 1с через вэб форму... очень жаль. |
|||
3
Serginio1
13.11.15
✎
11:45
|
||||
4
Serginio1
13.11.15
✎
11:49
|
||||
5
Serginio1
13.11.15
✎
11:51
|
||||
6
Fragster
гуру
13.11.15
✎
11:51
|
(2) не все так плохо. в принципе через текстовый документ можно реализовать для небольших (до нескольких мегабайт, возможно десятков) файлов нормальный разбор
|
|||
7
vhl
13.11.15
✎
11:51
|
(2) из Base64 не можешь двоичные данные что-ли получить?
|
|||
8
Fragster
гуру
13.11.15
✎
11:51
|
там же base64 + разделители практически
|
|||
9
Serginio1
13.11.15
✎
11:58
|
||||
10
Serginio1
13.11.15
✎
12:01
|
Всегда можно использовать
http://catalog.mista.ru/public/238584/ и http://stackoverflow.com/questions/16416601/c-sharp-httpclient-4-5-multipart-form-data-upload с await нужно добавить Result. Например HttpClient=Врап.СоздатьОбъект("System.Net.Http.HttpClient, System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"); preview=HttpClient.GetByteArrayAsync(Данные.url).Result; |
|||
11
Serginio1
13.11.15
✎
12:02
|
ДД=Base64Значение(Convert.ToBase64String(preview));
Картинка=Новый Картинка(ДД); |
|||
12
vhl
13.11.15
✎
12:08
|
(3) (4) (10) (9) горшочек, не вари1
|
|||
13
poyson
13.11.15
✎
12:09
|
(11) Проблема в общем как раз то в том, что в теле ответа есть и заголовки с элементами формы и их значениями и собственно бинарные данные ...
Для начала надо отделить мух от котлет... И вот тут проявляются проблемы работы с двоичными данными... При чем тут "Convert.ToBase64String(preview)"? |
|||
14
Serginio1
13.11.15
✎
12:11
|
Convert=Врап.ПолучитьТип("System.Convert");
преобразует byte[] в Base64String |
|||
15
vhl
13.11.15
✎
12:13
|
(13) ну так отрежь по ---boundary, в чем проблема?
|
|||
16
poyson
13.11.15
✎
12:18
|
(15) Отрезать не проблема. Но во тут и начинаются проблемы работы с бинарниками... часть символов 1с не видет(видимо те, у котрых размеры и коды 0) и не знает... они теряются и в итге сохраненный результат просто не открывается... хотя размеры совпадают с исходниками 1 в 1.
|
|||
17
poyson
13.11.15
✎
12:20
|
(14) проблема как раз в том, что в ответе присутствуют не только бинарки... после такого преобразования не получится убрать по разделителю из ответа секции с служебные секции
|
|||
18
Serginio1
13.11.15
✎
12:22
|
||||
19
vhl
13.11.15
✎
12:28
|
(18) ты в google набрал "Http Multipart Form" и теперь тупо копируешь сюда все ссылки подряд?
|
|||
20
Serginio1
13.11.15
✎
12:29
|
(19) Тупо наьираешь. Умно выбираешь. Ему подходит multipartFormDataContent.Add
using (var client = new HttpClient()) { using (var multipartFormDataContent = new MultipartFormDataContent()) { var values = new[] { new KeyValuePair<string, string>("Id", Guid.NewGuid().ToString()), new KeyValuePair<string, string>("Key", "awesome"), new KeyValuePair<string, string>("From", "khalid@home.com") //other values }; foreach (var keyValuePair in values) { multipartFormDataContent.Add(new StringContent(keyValuePair.Value), String.Format("\"{0}\"", keyValuePair.Key)); } multipartFormDataContent.Add(new ByteArrayContent(File.ReadAllBytes("test.txt")), '"' + "File" + '"', '"' + "test.txt" + '"'); var requestUri = "http://localhost:5949"; var result = client.PostAsync(requestUri, multipartFormDataContent).Result; } } |
|||
21
poyson
13.11.15
✎
12:31
|
Есть похожий варианты реализации на дельфи...
Интересно - заработает на 1С...? http://www.codenet.ru/progr/delphi/stat/dupload.php |
|||
22
Serginio1
13.11.15
✎
12:32
|
||||
23
poyson
13.11.15
✎
12:32
|
(20) Мне не надо добавлять в тело запроса бинарники...
Это как раз у меня есть... Мне нужно их оттуда вытащить... |
|||
24
Serginio1
13.11.15
✎
12:39
|
||||
25
poyson
13.11.15
✎
12:46
|
(24) А как это в 1с использовать?
|
|||
26
Serginio1
13.11.15
✎
12:54
|
||||
27
poyson
13.11.15
✎
14:23
|
(26) Спасибо в любом случае... Полезная вещь, надо попробовать...
|
|||
28
Serginio1
13.11.15
✎
14:26
|
(7) Ты можешь использовть динамическую обертку событий. Например по ссылке (24) ессть событие на получение файлов
http://catalog.mista.ru/public/417830/ |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |