С Новым годом! Форум программистов, компьютерный форум, киберфорум
Web API
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/48: Рейтинг темы: голосов - 48, средняя оценка - 4.69
12 / 12 / 2
Регистрация: 06.06.2012
Сообщений: 97

Отправка файла Web.Api в классе

11.01.2019, 13:13. Показов 10261. Ответов 21

Студворк — интернет-сервис помощи студентам
Добрый день, уважаемые форумчане!

Хочу отправить файл в webApi
Если мы делаем вот так
C#
1
2
3
4
5
6
[HttpPost]
        
        public IActionResult Test(IFormFile form)
        {
            return Ok();
        }
То проблем у нас нет. Со стороны клиента мы шлем Content-Disposition: form-data. Метод принимает файл и все чудесно работает.
Но я хочу передать IFormFile как поле в классе
Например так
Класс
C#
1
2
3
4
5
6
public  class Test
    {
        public int Id { get; set; }
        
        public IFormFile File { get; set; }
    }
И соответственно тогда контроллер будет выглядеть вот так
C#
1
2
3
4
5
public async Task<IActionResult> Test(Test test)
        {
            
            return Ok();
        }
И вот как в данном случае, мне передать класс в контроллер, при то что одно из полей класса это по сути файл?
Конечно я могу обойти эту проблему разделив логику на два метода. Но раз есть такая возможность для передачи IFormFile, хотелось бы им и воспользоваться. Но как со стороны фронтенда это сделать, хоть убей не пойму.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.01.2019, 13:13
Ответы с готовыми решениями:

Отправка картинки на сервер из WPF - Web Api Core
Приветствую всех! Я новичок в вебе. Не совсем понимаю некоторые вещи... Сейчас тренируюсь и делаю простое приложение для отправки картинок...

2 сервиса (WCF Web API и ASP.NET Web API) на одном хосте
Есть БД с юзерами Есть консольное приложение (OWIN selfhost) с контроллером ImportController : ApiController для выполнения POST запросов...

Отправка файла на сервер VK API
Пользуюсь библиотекой Synapse. Не могу отправить файл на сервер. В чем проблема не могу понять, дело в том что в ВК ты получаешься...

21
.NET C#,ASP.NET MVC
Эксперт .NET
 Аватар для lvlkoo
594 / 507 / 224
Регистрация: 16.10.2010
Сообщений: 1,902
12.01.2019, 01:06
Цитата Сообщение от speed5.Mexanik Посмотреть сообщение
Со стороны клиента мы шлем Content-Disposition: form-data
Наверное всетаки мультипарт шлете?

Так шлите остальные данные тоже в форме, главное чтобы название boundary с файлом совпадало с именем поля в моделе.

Цитата Сообщение от speed5.Mexanik Посмотреть сообщение
Но как со стороны фронтенда это сделать, хоть убей не пойму.
Собирайте данные в FormData
0
12 / 12 / 2
Регистрация: 06.06.2012
Сообщений: 97
13.01.2019, 20:23  [ТС]
Все данные слать в форме, это конечно не плохо. Особенно когда класс состоит из нескольких полей. Но если класс, состоит из полей, которые тоже являются классами, то вложить такие поля в FormData, я не смог. Можно пример конкретной реализации? Если конечно не затруднит.
0
.NET C#,ASP.NET MVC
Эксперт .NET
 Аватар для lvlkoo
594 / 507 / 224
Регистрация: 16.10.2010
Сообщений: 1,902
13.01.2019, 21:36
Цитата Сообщение от speed5.Mexanik Посмотреть сообщение
Но если класс, состоит из полей, которые тоже являются классами,
Дело только в названии передаваемого в форме "инпута"

Prop1.NestedProp2.NestedProp3 итд...
0
163 / 138 / 35
Регистрация: 25.11.2015
Сообщений: 910
14.01.2019, 15:14
Цитата Сообщение от speed5.Mexanik Посмотреть сообщение
Все данные слать в форме, это конечно не плохо. Особенно когда класс состоит из нескольких полей. Но если класс, состоит из полей, которые тоже являются классами, то вложить такие поля в FormData, я не смог. Можно пример конкретной реализации? Если конечно не затруднит.
В таком случае надо не менять объект целиком, а частично. Если есть список, внутри объекта - не изменять весь объект со списком, а реализовать CRUD(создание-чтение-редактирование-удаление) на каждую строку.
Тоже самое можно сделать для отдельных свойств модели.
0
12 / 12 / 2
Регистрация: 06.06.2012
Сообщений: 97
20.01.2019, 02:26  [ТС]
Цитата Сообщение от yurickas Посмотреть сообщение
В таком случае надо не менять объект целиком, а частично. Если есть список, внутри объекта - не изменять весь объект со списком, а реализовать CRUD(создание-чтение-редактирование-удаление) на каждую строку.
Тоже самое можно сделать для отдельных свойств модели.
Хорошо, у меня в классе 50 полей, для каждого будем реализовать CRUD(создание-чтение-редактирование-удаление)?
Это попахивает бредом. Без обид конечно.
Я конечно же решил данную проблему. Разделил на два этапа, вначале создаю объект класса в одним из методов, а вторым добавляю файл, но это конечно тоже решение аховое.

Добавлено через 5 минут
Цитата Сообщение от lvlkoo Посмотреть сообщение
Дело только в названии передаваемого в форме "инпута"

Prop1.NestedProp2.NestedProp3 итд...
Извините, не мог проверить Ваш совет, был жесткий дедлайн, и решение требовалось срочно. Как я написал Ваше. Проблему обошел, создавай вначале запись в базе, и только потом добавляя по id модели к ней файл. Но это решение временное так быть не должно. Насчет Prop1.NestedProp2.NestedProp3, не пойдет, это бизнесс модель, со сложной связанной структурой. На класс может быть больше нескольких подклассов, а все перечислять через точку понятное дело не вариант. Во первых это просто дикая потеря времени, второе и самое главное, такой код поддерживать, при возможном изменении бизнесс-логики невозможно. Поменяются поля в классе, и я буду везде через точки менять? Нужно думать. За советы спасибо.
0
.NET C#,ASP.NET MVC
Эксперт .NET
 Аватар для lvlkoo
594 / 507 / 224
Регистрация: 16.10.2010
Сообщений: 1,902
20.01.2019, 14:59
Цитата Сообщение от speed5.Mexanik Посмотреть сообщение
Нужно думать.
Ничего другого не придумать.

Как десереализатор понимает что в поле "Prop1" нужно положить одно значение, а в "Prop2" Другое? По имени инпутае. Как тогда ему понять, что нужно положить в "ClassProp1.ClassProp2.ClassProp3.ClassP rop4..." Соотвественно так же по имени инпута которое будет путем к конченому полю

Цитата Сообщение от speed5.Mexanik Посмотреть сообщение
это бизнесс модель, со сложной связанной структурой.
У вас не должно быть связной сложной модели на этапе передачи данных из View в контроллер. Пересмотрите свою архитектуру, разделите все на несколько view\partial view\форм. В крайнем случае собирайте js'ом json модель и шлитее уже ее в контроллер
1
12 / 12 / 2
Регистрация: 06.06.2012
Сообщений: 97
20.01.2019, 16:21  [ТС]
Цитата Сообщение от lvlkoo Посмотреть сообщение
Ничего другого не придумать.

Как десереализатор понимает что в поле "Prop1" нужно положить одно значение, а в "Prop2" Другое? По имени инпутае. Как тогда ему понять, что нужно положить в "ClassProp1.ClassProp2.ClassProp3.ClassP rop4..." Соотвественно так же по имени инпута которое будет путем к конченому полю


У вас не должно быть связной сложной модели на этапе передачи данных из View в контроллер. Пересмотрите свою архитектуру, разделите все на несколько view\partial view\форм. В крайнем случае собирайте js'ом json модель и шлитее уже ее в контроллер
По сути это недоработка системы Net.Core. В mvc standart этих проблем нет, например. Но на данном этапе, глубже копаться нет времени. Вернемся к этому вопросу, где то через месяц. И что-нибудь придумаем. Всем спасибо!
0
.NET C#,ASP.NET MVC
Эксперт .NET
 Аватар для lvlkoo
594 / 507 / 224
Регистрация: 16.10.2010
Сообщений: 1,902
20.01.2019, 16:26
Цитата Сообщение от speed5.Mexanik Посмотреть сообщение
Net.Core.
Цитата Сообщение от speed5.Mexanik Посмотреть сообщение
В mvc standart
Вы явно в чем-то запутались.

MVC это паттерн. ASP.NET Core имеет возможность этот паттер реализовать (причем отлично).
0
12 / 12 / 2
Регистрация: 06.06.2012
Сообщений: 97
20.01.2019, 16:58  [ТС]
Цитата Сообщение от lvlkoo Посмотреть сообщение
Вы явно в чем-то запутались.

MVC это паттерн. ASP.NET Core имеет возможность этот паттер реализовать (причем отлично).
Давайте еще раз. Повторим в чем у меня проблема. Мне обратить к контроллеру Net.Core Web.Api и передать ему файл, но не просто файл, а еще и класс. Либо вложив этот файл в класс с помощью поля. Вот так
C#
1
2
3
4
5
6
public  class Test
    {
        public int Id { get; set; }
        
        public IFormFile File { get; set; }
    }
Либо передав в контроллер вот так
C#
1
2
3
4
5
[HttpPost]
        public ActionResult File (Test test, IFormFile File)
        {
            return null;
        }
Ни первый, ни второй способо не проходят.
В первом случае, я не пойму как и из клиента отдать файл в классе.
Во втором, вообще ошибка.

Единственно что удлалось сделать, это
C#
1
2
3
4
5
[HttpPost]
        public ActionResult File ([FromForm] string DocumentID, IFormFile File)
        {
            return null;
        }
Но для этого что бы я добавил файлы к документу, он уже должен быть создан.
Так как в одном запросе, я не смог передать класс документа(для созадния), и файл к нему(для добавления к документу)
Если Вы знаете, как это сделать, то поделитесь кодом. Сразу его и проверим.
0
 Аватар для sau
2773 / 2073 / 386
Регистрация: 22.07.2011
Сообщений: 7,820
20.01.2019, 17:02
Цитата Сообщение от speed5.Mexanik Посмотреть сообщение
это бизнесс модель, со сложной связанной структурой.
бизнес модель не должна являться моделью данных БД или моделью данных представления , потому , что это тупо не удобно использовать и в большинстве случаев данные бизнес модели будут избыточными.
По этому , все просто , делаете для представления свою модель , отражаете на нее необходимые поля бизнес модели и не имеете никаких проблем.
0
12 / 12 / 2
Регистрация: 06.06.2012
Сообщений: 97
20.01.2019, 17:14  [ТС]
Цитата Сообщение от sau Посмотреть сообщение
бизнес модель не должна являться моделью данных БД или моделью данных представления , потому , что это тупо не удобно использовать и в большинстве случаев данные бизнес модели будут избыточными.
По этому , все просто , делаете для представления свою модель , отражаете на нее необходимые поля бизнес модели и не имеете никаких проблем.
Столько слов, и нет ни одного примера ни от кого. Очень много советов, о том как не надо делать, и ни одного как надо.
Есть задача, создать документ, прикрепив к нему несколько файлов. Запрос через Web.Api. У меня ПРОБЛЕМА, нет возможности передать IFormFile ни в классе, ни вместе с классом. Как не надо делать я понял, спасибо. Подскажите, как надо сделать. Забудьте о базе, и о прочей лабуде. Конкретный вопрос.
0
 Аватар для sau
2773 / 2073 / 386
Регистрация: 22.07.2011
Сообщений: 7,820
20.01.2019, 19:28
https://docs.microsoft.com/en-... ata-part-2

Я , кстати , не понял , Вы с веб.апи контроллером взаимодействуете или с mvc контроллером ?
- ибо есть принципиальная разница , клиентами веб.апи могут быть любые приложения и они должны придерживаться определенного протокола передачи данных , из стандартных это может быть Json или xml , если же клиентом становится браузер и отправляет данные формы - то естественно такие данные веб.апи контроллер не поймет и нужно будет вытягивать их вручную из контекста запроса , а по сути написать своего поставщика , придерживаясь определенных интерфейсов для таких случаев в web.api фреймворке.

Mvc контроллер , в отличии от апи контроллера , нацелен на работу в формате стандарта html форм - ключ/значение в теле пакета или в заголовке. , и тут уже применяются совершенно иные правила разбора и десериализации данных запроса.
0
.NET C#,ASP.NET MVC
Эксперт .NET
 Аватар для lvlkoo
594 / 507 / 224
Регистрация: 16.10.2010
Сообщений: 1,902
20.01.2019, 21:47
Цитата Сообщение от sau Посмотреть сообщение
такие данные веб.апи контроллер не поймет
Уверены? апи контролер десериализует данные на основе полученого content-type, и вроде как он вполне себе может работать с form-data
0
12 / 12 / 2
Регистрация: 06.06.2012
Сообщений: 97
20.01.2019, 21:53  [ТС]
Цитата Сообщение от sau Посмотреть сообщение
https://docs.microsoft.com/en-... ata-part-2

Я , кстати , не понял , Вы с веб.апи контроллером взаимодействуете или с mvc контроллером ?
- ибо есть принципиальная разница , клиентами веб.апи могут быть любые приложения и они должны придерживаться определенного протокола передачи данных , из стандартных это может быть Json или xml , если же клиентом становится браузер и отправляет данные формы - то естественно такие данные веб.апи контроллер не поймет и нужно будет вытягивать их вручную из контекста запроса , а по сути написать своего поставщика , придерживаясь определенных интерфейсов для таких случаев в web.api фреймворке.

Mvc контроллер , в отличии от апи контроллера , нацелен на работу в формате стандарта html форм - ключ/значение в теле пакета или в заголовке. , и тут уже применяются совершенно иные правила разбора и десериализации данных запроса.
Web.Api, сейчас я подробно отвечу человеку ниже. И Вы сами все поймете.

Добавлено через 1 минуту
Цитата Сообщение от lvlkoo Посмотреть сообщение
Уверены? апи контролер десериализует данные на основе полученого content-type, и вроде как он вполне себе может работать с form-data
Уверен, это проблема Net.Core Web.Api, сейчас я Вам все распишу. Если есть желание. Готов поднять проект со Swagger, с разными способами передачи данных, и мы все проверим вместе. Сейчас напишу и выложу удаленный доступ. 15 минут
0
12 / 12 / 2
Регистрация: 06.06.2012
Сообщений: 97
20.01.2019, 22:42  [ТС]
Цитата Сообщение от lvlkoo Посмотреть сообщение
Уверены? апи контролер десериализует данные на основе полученого content-type, и вроде как он вполне себе может работать с form-data
Ну поехали.
Набросал следующий контроллер. Net.Core 2.2 Web.Api
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
[Route("api/[controller][action]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
 
        // GET api/values
        public ValuesController()
        {
 
        }
 
 
        [HttpPost]
        [AllowAnonymous]
        public ActionResult FileUpload1(Test document, IFormFile File)
        {
            return Ok(File.FileName);
        }
 
 
        [HttpPost]
        [AllowAnonymous]
        public ActionResult FileUpload_Variant2(Test2 document)
        {
            return Ok(document.File.Name);
        }
 
        [HttpPost]
        [AllowAnonymous]
        public ActionResult FileUpload3([FromForm]Test Document, IFormFile file)
        {
            return Ok(file.Name);
        }
 
        public class Test
        {
            public int Id { get; set; }
 
            public string name { get; set; }
 
 
 
        }
        public class Test2
        {
            public int Id { get; set; }
 
            public string name { get; set; }
 
            public IFormFile File { get; set; }
        }
 
        public class Test3
        {
            public int Id { get; set; }
 
            public string Name { get; set; }
        }
 
 
    }
Test - класс c вложенным классом Test3, который мы попробуем передать вместе с IFormFile
Test2 - это класс с вложенным полем IFormFile
Исходя из Ваших советов, я создал три метода

Первый
C#
1
public ActionResult FileUpload1(Test document, IFormFile File)
это попытка отдать класс с необходимыми нам полями, и соответственно сам файл. Смотрим сваггер.
На первый взгляд вроде как все не плохо
Пытаемся передать класс, и сам файл
И получаем Unsupported Media Type

С попыткой отправить файл и класс мы покончили

Берем второй метод
C#
1
2
3
4
5
6
[HttpPost]
        [AllowAnonymous]
        public ActionResult FileUpload_Variant2(Test2 document)
        {
            return Ok(document.File.Name);
        }
Здесь мы берем класс
C#
1
2
3
4
5
6
7
8
public class Test2
        {
            public int Id { get; set; }
 
            public string name { get; set; }
 
            public IFormFile File { get; set; }
        }
В котором одно из полей является файлом
Смотрим swagger, И это тот случай, когда я не нашел способ со стороны клиента передать файл в классе. Если, кто то знает как это сделать, то добро пожаловать.

Третий метод, это идея lvlkoo передавать значение полей как поля из Form посмотрим на сваггер И видим, что вложенного класса, просто в формате запроса нет. Как к нему добраться не понятно.А если бы и было понятно, то описывать все вложенные классы через точку, это бред. Как потом поддерживать продукт?

Вот вкратце и все. Хотя какой нафиг вкратце ) Адрес для теста, могу дать, если будет нужно!
0
12 / 12 / 2
Регистрация: 06.06.2012
Сообщений: 97
20.01.2019, 22:51  [ТС]
Извините не вложил класс TEst3 в класс Test. В этом случае сваггер выглядит вот так
Но, как я говорил нам от этого не легче!
0
 Аватар для sau
2773 / 2073 / 386
Регистрация: 22.07.2011
Сообщений: 7,820
21.01.2019, 02:09
Лучший ответ Сообщение было отмечено speed5.Mexanik как решение

Решение

Цитата Сообщение от lvlkoo Посмотреть сообщение
Уверены? апи контролер десериализует данные на основе полученого content-type, и вроде как он вполне себе может работать с form-data
Json и xml дают возможность передавать сложные иерархические структуры , а form-data это только одноуровневые данные ,
что касается укладки комплексных свойств в поля через точку в mvc для форм - - так это только Mvc фича , которая стандартным форматом передачи данных не является и нигде кроме как в asp net mvc не поддерживается.
Скажем , отправьте данные в таком формате на любой другой rest сервис и скорее всего вас жестоко обругают , тогда как xml/json все понимают.

Добавлено через 14 минут
Цитата Сообщение от speed5.Mexanik Посмотреть сообщение
И получаем Unsupported Media Type
попробуйте зарегистрировать соответствующий форматор , на счет core 2 не знаю , но в web api 2 для нестандартных content-type нужно было писать и регистрировать свой форматер со своей сериализацией.
Но , так же там был стандартный FormUrlEncodedFormatter.

И это тот случай, когда я не нашел способ со стороны клиента передать файл в классе.
Как вариант , упаковать бинарные данные файла в base64 и передать в теле json
1
12 / 12 / 2
Регистрация: 06.06.2012
Сообщений: 97
21.01.2019, 02:46  [ТС]
Цитата Сообщение от sau Посмотреть сообщение
попробуйте зарегистрировать соответствующий форматор
С этим попробую разобраться, спасибо за идею.

Цитата Сообщение от sau Посмотреть сообщение
Как вариант , упаковать бинарные данные файла в base64 и передать в теле json
Кстати, вполне здравый совет. Тоже спасибо.
0
0 / 0 / 0
Регистрация: 19.12.2019
Сообщений: 5
22.09.2020, 16:15
Добрый день. А не подскажите как реализовал отправку файлов из декстопа на сервер webApi??
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.09.2020, 16:15
Помогаю со студенческими работами здесь

Web audio api доступ к информации внутри файла
Уважаемые, не могу собрать очень простую схему. Мне нужно получить массив сэмплов из wav файла. Делаю следующие var audio = new...

Отправка СМС в API 15
Здравствуйте. Столкнулся с проблемой в API 15. При попытке отправки СМС сообщения из приложения оно не отправляется, хотя в API 27 всё...

VK.API - Отправка фото
Доброго времени суток! Столкнулся с проблемой при отправке картинки в CURL на api.vk Есть код: $image =...

Отправка документов VK API
Добрый день, подскажите пожалуйста, в чем может быть проблема, хочу загрузить документ в сообщения и отправить пользователю, с котором веду...

Telegram API отправка аудио
Всем привет! Отправляю файл в телеграм через url, тоесть /sendAudio?chat_id=1&amp;audio=https://web.com/audio.mp3 но я не могу изменить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru