Имя: Пароль:
1C
1С v8
передача файла в 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/