С Новым годом! Форум программистов, компьютерный форум, киберфорум
Web API
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860

Отправка картинки на сервер из WPF - Web Api Core

04.06.2018, 20:52. Показов 4067. Ответов 11

Студворк — интернет-сервис помощи студентам
Приветствую всех! Я новичок в вебе. Не совсем понимаю некоторые вещи... Сейчас тренируюсь и делаю простое приложение для отправки картинок на сервер. Задачу себе расписал такую: Клиент на WPF (без MVVM), просто формочка. Поля: Имя, Фамилия, Отдел и кнопка открыть картинку (загрузка фото человека), ну и время, когда были отправлены данные так же записываю в БД MSSQL пока локально. Для работы с БД использую EF + Code First. С текстовыми данными у меня вроде бы получилось. А вот с картинкой совсем не понимаю как быть. BLOB отметаю. Помогите реализовать. Мне необходима именно реализация, так как она у меня и хромает. Буду благодарен, если кто-то дополнит мой код для передачи картинок и сохранения их путей и тд.. (Контекст и регистрацию показывать не буду, что бы не нагромождать код).
Сервер
Модель:
C#
1
2
3
4
5
6
7
8
9
 public class Person
    {
        public Guid Id { get; set; }
        public string Name { get; set; }
        public string LastName { get; set; }
        public string Department { get; set; }
        public DateTimeOffset DateTime { get; set; }
        public string Path { get; set; }
    }
Репозиторий:
C#
1
2
3
4
5
6
7
8
    public interface IPersonRepository
    {
        Person Add(Person person);
        Person Get(Guid id);
        IEnumerable<Person> GetAll();
        void Remove(Guid id);
        bool Update(Person person);
    }
Кликните здесь для просмотра всего текста

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
62
63
64
65
66
67
public class PersonRepository : IPersonRepository
    {
        private readonly PersonContext _personContext;
      
        
        public PersonRepository(PersonContext personContext)
        {
            _personContext = personContext;
        }
 
        
        public Person Add(Person person)
        {
            try
            {
                 person.Id = Guid.NewGuid();
                _personContext.Persons.Add(person);
                _personContext.SaveChanges();
            }
            catch (Exception err)
            {
                throw new Exception(err.Message);
            }
            return person;
        }
 
     
        public Person Get(Guid id)
        {
            return _personContext.Persons.SingleOrDefault(c => c.Id == id);
        }
 
      
        public IEnumerable<Person> GetAll()
        {
            try
            {
                return _personContext.Persons.AsQueryable();
            }
            catch (Exception err)
            {
                throw new Exception(err.Message);
            }
        }
 
        public void Remove(Guid id)
        {
 
            try
            {
                Person employeeToRemove = new Person { Id = id };
                _personContext.Persons.Attach(employeeToRemove);
                _personContext.Persons.Remove(employeeToRemove);
                _personContext.SaveChanges();
            }
            catch (Exception err)
            {
                throw new Exception(string.Format("Сотрудника не существует или запись удалена!" + err.Message));
            }
 
        }
 
        public bool Update(Person person)
        {
            throw new NotImplementedException();
        }
    }

Контроллер:
Кликните здесь для просмотра всего текста

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
 [Route("api/[controller]")]
    public class PersonController : Controller
    {
 
        public IPersonRepository Person { get; set; }
 
        public PersonController(IPersonRepository person)
        {
            Person = person;
        }
 
        public IEnumerable<Person> GetAll()
        {
            return Person.GetAll();
        }
 
        [HttpGet("{id}", Name = "GetTodo")]
        public IActionResult GetById(Guid id)
        {
            var item = Person.Get(id);
            if (item == null)
            {
                return NotFound();
            }
            return new ObjectResult(item);
        }
 
        [HttpPost]
        public IActionResult Create([FromBody] Person person)
        {
            if (person == null)
            {
                return BadRequest();
            }
            Person.Add(person);
            return CreatedAtRoute("GetTodo", new { id = person.Id }, person);
        }
 
        
        [HttpPut("{id}")]
        public IActionResult Update(string id, [FromBody] Person person)
        {
            //if (person == null || person.Id != id)
            //{
            //    return BadRequest();
            //}
 
            //var todo = Person.Find(id);
            //if (todo == null)
            //{
            //    return NotFound();
            //}
 
            //Person.Update(person);
            //return new NoContentResult();
            return null;
        }
 
        [HttpPatch("{id}")]
        public IActionResult Update([FromBody] Person item, string id)
        {
            //if (item == null)
            //{
            //    return BadRequest();
            //}
 
            //var todo = Person.Find(id);
            //if (todo == null)
            //{
            //    return NotFound();
            //}
 
            //item.Key = todo.Key;
 
            //Person.Update(item);
            //return new NoContentResult();
            return null;
        }
 
        [HttpDelete("{id}")]
        public IActionResult Delete(Guid id)
        {
            var todo = Person.Get(id);
            if (todo == null)
            {
                return NotFound();
            }
 
            Person.Remove(id);
            return new NoContentResult();
        }
 
    }


Клиент
Кликните здесь для просмотра всего текста

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
public partial class MainWindow : Window
    {
        String urlAddress = ConfigurationManager.AppSettings["serverUriString"];
 
        public MainWindow()
        {
            InitializeComponent();
            BindTodoList();
        }
 
        private void BindTodoList()
        {
            HttpClient client = new HttpClient();
            client.BaseAddress = new Uri(urlAddress);
 
            // Add an Accept header for JSON format.
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
 
            using (HttpResponseMessage response = client.GetAsync("api/person/").GetAwaiter().GetResult())
            {
                if (response.IsSuccessStatusCode)
                {
                    var employees = response.Content.ReadAsAsync<IEnumerable<Person>>().GetAwaiter().GetResult();
                    grdEmployee.ItemsSource = employees;
                }
                else
                {
                    MessageBox.Show("Error Code" + response.StatusCode + " : Message - " + response.ReasonPhrase);
                }
            }
 
        }
 
        private void btnDelete_Click(object sender, RoutedEventArgs e)
        {
            HttpClient client = new HttpClient();
 
            client.BaseAddress = new Uri(urlAddress);
 
            // ДИЧЬ!!!!
            var id = grdEmployee.SelectedItem;
 
            var url = "api/person/" + id.ToString();
 
            using (HttpResponseMessage response = client.DeleteAsync(url).GetAwaiter().GetResult())
            {
                if (response.IsSuccessStatusCode)
                {
                    MessageBox.Show("User Deleted");
                    BindTodoList();
 
                }
                else
                {
                    MessageBox.Show("Error Code" + response.StatusCode + " : Message - " + response.ReasonPhrase);
                }
            }
           
        }
 
        private void btnSearch_Click(object sender, RoutedEventArgs e)
        {
            //HttpClient client = new HttpClient();
            //client.BaseAddress = new Uri("http://localhost:3479");
 
            //client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
 
            //var id = txtId.Text.Trim();
 
            //var url = "api/person/" + id;
 
            //using (HttpResponseMessage response = client.GetAsync("http://localhost:3479").GetAwaiter().GetResult())
            //{
            //    if (response.IsSuccessStatusCode)
            //    {
            //        try
            //        {
            //            var employees = response.Content.ReadAsAsync<Person>().GetAwaiter().GetResult();
 
            //            MessageBox.Show("Employee Found : " + employees.Name + " " + employees.Id);
            //        }
            //        catch (Exception err)
            //        {
            //            MessageBox.Show("Something went wrong ", err.Message, MessageBoxButton.OK, MessageBoxImage.Warning);
            //        }
 
 
            //    }
            //    else
            //    {
            //        MessageBox.Show("Error Code" + response.StatusCode + " : Message - " + response.ReasonPhrase);
            //    }
            //}
 
              
        }
 
        private void btnAdd_Click(object sender, RoutedEventArgs e)
        {
            HttpClient client = new HttpClient();
            client.BaseAddress = new Uri(urlAddress);
 
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            var todo = new Person();
 
            todo.Name = txtName.Text;
            todo.LastName = txtLastName.Text;
            todo.Department = txtDepartment.Text;
            todo.Path = txtPath.Text;
            todo.DateTime = DateTime.Now;
 
            using (var response = client.PostAsJsonAsync("api/person/", todo).GetAwaiter().GetResult())
            {
                if (response.IsSuccessStatusCode)
                {
                    MessageBox.Show("Employee Added");
                    txtName.Text = "";
                    txtLastName.Text = "";
                    txtDepartment.Text = "";
                    txtPath.Text = "";
                    BindTodoList();
                }
                else
                {
                    MessageBox.Show("Error Code" + response.StatusCode + " : Message - " + response.ReasonPhrase);
                }
            }
 
               
        }
 
        private void btnShowAll_Click(object sender, RoutedEventArgs e)
        {
            BindTodoList();
            
        }
 
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            BindTodoList();
        }
 
        private void btnOpenFile_Click(object sender, RoutedEventArgs e)
        {
            DialogService dialogService = new DialogService();
 
            if(dialogService.OpenFileDialog())
            {
 
            }
        }
 
        public bool SendData(byte[] image)
        {
         
           return true;
        }
    }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.06.2018, 20:52
Ответы с готовыми решениями:

Загрузка картинки на сервер по ссылке, отправка, удаление картинки
Какие есть методы, чтобы: а) Загрузить на сервер в папку ../temp картинку по ссылке (например,...

.Net Core Web Api и Angular 2
Backend - .Net Core Web Api Frontend- Angular 2. Подскажите пожалуйста как реализовать подключение БД MS SQL Server, и где прописывать...

.Net Core web api REST
сервер для небольшой игры на .Net Core web API

11
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
04.06.2018, 21:25
Цитата Сообщение от Jman Посмотреть сообщение
Помогите реализовать.
Jman, на мой взгляд, вы выбрали не ту технологию для решения вашей задачи. WebAPI, конечно, хорош и удобен, но на мой взгляд, его использование больше подходит для случаем, где клиентской стороной является браузер. В вашем же случае нужно обычное приложение, что и приводит к тому, что вам приходится работать с такими неуклюжими (для данной ситуации), на мой взгляд, конструкциями, как ручное использование HttpClient-а и прочее.
При таких требованиях я бы применил то, что больше для этого подходит, а именно-WCF. Он куда как удобнее, именно для создания клиент-серверных приложений.
В принципе, если потребуется, могу сделать вам простой пример. Я так понял, вам нужно отправлять в БД и получать из нее модель, которая описывает пользователя, со всеми его данными (включая фото).
0
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
04.06.2018, 21:39  [ТС]
Я смотрел в сторону WCF, но это типо легаси и не круто. Меня гуру переубедили писать на кор (изначально я начал на Web Api MVC). Тут еще такой нюанс, если я верно понимаю. Есть ли смысл от WCF - если у него один контракт и сервис будет?. В общем я остановился пока на веб апи, другое уже не рассматриваю в данном случае ибо и так все силы потратил на изучение этой технологии.
Да, вы верно поняли. Код который мне удалось написать, реализует как раз это, кроме отправки картинки и сохранения ее пути или имя в БД, это для меня пока самое сложное и я вообще не могу понять.. Я находил примеры на StackOverflow, но вот правильно прикрутить не знаю как. Нужно ли хранить метаданные картинки в БД или можно как-то напрямую в папку на сервер через HttpClient положить... Я раньше работал с картинками, но на примитивном уровне. Просто упаковывал их в бд =)
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
04.06.2018, 21:42
Цитата Сообщение от Jman Посмотреть сообщение
Я смотрел в сторону WCF, но это типо легаси и не круто.
С чего вы это взяли? Насколько я знаю, никто от этой технологии не отказывается. Да и понятие крутизны-вообще полная чушь. Есть задача, нужно ее решить. Берем то, что больше всего для этого подходит и работаем. Оно, конечно, можно и микроскопом гвозди заколачивать, но зачем, если есть молоток?
Цитата Сообщение от Jman Посмотреть сообщение
Есть ли смысл от WCF
Есть, конечно. В данной ситуации он более удобен.
Цитата Сообщение от Jman Посмотреть сообщение
В общем я остановился пока на веб апи
Дело ваше))) Ваше приложение, решайте задачу)
0
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
04.06.2018, 21:44  [ТС]
Цитата Сообщение от insite2012 Посмотреть сообщение
Ваше приложение, решайте задачу)
Вот дошел до того момента, когда уперся. И необходима помощь. Дело вроде простое, но не хватает опыта пока.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
04.06.2018, 21:52
Цитата Сообщение от Jman Посмотреть сообщение
необходима помощь.
Посмотрите тут, может и поможет)
И вот еще простой пример.
0
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
04.06.2018, 21:59  [ТС]
Спасибо за ссылки! На данный момент у меня только одна проблема - передать правильно картинку (не BLOB). Имя, Фамилия и тд, передаю и читаю из БД.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
04.06.2018, 22:02
Цитата Сообщение от Jman Посмотреть сообщение
На данный момент у меня только одна проблема - передать правильно картинку (не BLOB).
Ну если вас массив байт не устраивает, преобразуйте его в строку Base64, например, и так и храните в БД. При извлечении оттуда приводите обратно.
1
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
05.06.2018, 09:55  [ТС]
Ребят, может кто-нибудь помочь с реализацией?
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
05.06.2018, 11:04
Цитата Сообщение от Jman Посмотреть сообщение
Ребят, может кто-нибудь помочь с реализацией?
Jman, я вам вроде выше написал, как можно работать с картинкой... Но если вам нужен простой пример-то вот он. Все уходит на сервер, и потом то же самое приходит назад (картинка снова сохраняется под другим именем для проверки).
Вложения
Тип файла: rar Jman.rar (12.52 Мб, 27 просмотров)
1
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
07.06.2018, 13:49  [ТС]
Не совсем то что мне необходимо. Я сейчас скину проект. Там конечно не доделано. Если не затруднит, прошу поправить. Совсем запутался что-то. В клиенте нет модели. На стороне сервера основная модель, и создал модель для обмена с клиентом без пути к папке сохранения(не знаю так правильно или нет). Так же в контроллере не правильно, реализация MVC, а у меня WebApi. В обработчике кнопки на отправку на сервер то же не знаю как правильно. Надо наверное HttpClient использовать.
Вложения
Тип файла: zip FileUploadWebApiTest.zip (1.38 Мб, 8 просмотров)
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
07.06.2018, 14:02
Цитата Сообщение от Jman Посмотреть сообщение
В клиенте нет модели.
Ну так добавьте ее в клиент, точно такую же как и на серверной стороне.
Цитата Сообщение от Jman Посмотреть сообщение
Так же в контроллере не правильно, реализация MVC, а у меня WebApi.
Немного не так, у вас Core, а у меня обычный WebAPI.
Цитата Сообщение от Jman Посмотреть сообщение
Надо наверное HttpClient использовать.
Ну так по второй ссылке выше как раз и показано, как его использовать... И у меня точно такое же его использование.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.06.2018, 14:02
Помогаю со студенческими работами здесь

Асинхронная отправка API запросов в WPF
Здравствуйте. Есть код, который отлично работает в консольном приложении. Его суть в том, что он отправляет асинхронно некоторое количество...

Ajax запрос на контроллер web api core
Добрый день ! как сделать ajax запрос на контроллер asp net core web api ? есть проект web api в нем определенн контроллер ...

WPF + ASP.NET Web API 2
Други, только начал изучать программирование. Не могли бы вы подсказать как создать проект по таким данным? REQUIRED CLIENT...

Установка Angular 2.3 на ASP .Net Core Web Api
В интернете куча примеров установки ангуляра, но старых версий. Они не подходят для установки с Ангуляром 2.3.0. Я проект на ангуляре...

Передача данных из Asp.net core web api в angular 8
1. Объясните кто нибудь пожалуйста, как передавать данные их 3 таблиц (many to many) Из asp.net core 2.2 web api application в angular 8 ...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
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 считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru