Загрузить файлы с проектом форм Windows С# на веб-сервер

Я закончил приложение на С#, используя winform для загрузки изображения на веб-сервер. Я искал этот сайт и другие сайты, чтобы найти ответ, как загрузить файл, но ни один ответ не решил проблему.

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

это код, который я использовал:

private async void BtnUpload_Click(object sender, EventArgs e)
{
    //c# open file dialog with image filters
    using (OpenFileDialog ofd = new OpenFileDialog() { Filter = "Image Files(*.jpg; *.jpeg; *.gif; *.bmp; *.png)|*.jpg; *.jpeg; *.gif; *.bmp; *.png" })
    {
        // Get the file path from the use
        if (ofd.ShowDialog() == DialogResult.OK)
        {
            //c# display image in picture box  
            pictureBox1.Image = new Bitmap(ofd.FileName);
            //c# show image file path  
            txtFileName.Text = ofd.FileName;
            //c# upload image to web server
            using (var fileStream = File.Open(ofd.FileName, FileMode.Open))
            {
                // Set the URL of the server script that handles the upload
                var client = new RestClient("https://blabla.com/Images/");
                var request = new RestRequest(Method.Post.ToString());
                using (MemoryStream memoryStream = new MemoryStream())
                {
                    await fileStream.CopyToAsync(memoryStream);
                    request.AddFile("file", memoryStream.ToArray(), ofd.FileName);
                    request.AlwaysMultipartFormData = true;
                    var response = await client.ExecuteAsync(request);
                    if (response.StatusCode == System.Net.HttpStatusCode.OK)
                    {
                        dynamic json = JsonConvert.DeserializeObject(response.Content);
                        string fileName = json.fileName;
                        MessageBox.Show("Success uploading image");
                    }
                    else
                    {
                        MessageBox.Show("Failed uploading image");
                    }
                }
            }
        }
    }
}

В этом коде у меня есть эта ошибка:

System.IO.IOException: «Процесс не может получить доступ к файлу «D:\NATRO\IMG-20240813-WA0002.jpg», поскольку он используется другим процессом». и не нашел решения для этого..

тогда я использую этот код: using (var fileStream = File.OpenRead(ofd.FileName)) и результат (как MessageBox)

Не удалось загрузить изображение.

Также я попробовал File.OpenWrie File.но безрезультатно.

В этой статье [https://stackoverflow.com/questions/7110300/uploading-images-in-winforms-application] я не нашел подходящего решения.

Если мне нужно написать код на стороне сервера, где именно мне его написать??

Надеюсь найти полезные ответы.

Спасибо и привет...

Для начала переместите это: pictureBox1.Image = new Bitmap(ofd.FileName); после блока using Stream. Или не используйте new Bitmap(), вместо этого Image.FromStream(new MemoryStream(File.ReadAllBytes(ofd.FileName)), true, false). Создание растрового изображения с помощью new Bitmap() блокирует файл на диске.

Jimi 17.08.2024 12:52

изменил эту строку PictureBox1.Image = new Bitmap(ofd.FileName); с этим imageBox1.Image = Image.FromStream(new MemoryStream(File.ReadAllBytes(ofd.FileName)), true, false); и результат тот же. Не удалось загрузить изображение.

MUHAMMED DÖNMEZ 17.08.2024 12:53

Не удалось, почему? Из-за того же System.IO.IOException? Или что-то еще?

Jimi 17.08.2024 12:56

Нет, это не то же самое System.IO.IOException, это из условия if в этой строке, если (response.StatusCode == System.Net.HttpStatusCode.OK) StatusCode равен 0

MUHAMMED DÖNMEZ 17.08.2024 12:59

Итак, растровое изображение теперь загружено правильно. Если StatusCode равен 0, у вас есть ответ на соединение FIN: соединение закрыто.

Jimi 17.08.2024 13:04

Вы имеете в виду, что я не могу правильно добраться до пути? (на стороне сервера)..

MUHAMMED DÖNMEZ 17.08.2024 13:08

Означает, что соединение было корректно закрыто. Возможно, произошел сбой обмена протоколом SSL (подтверждение TLS может завершиться неудачно из-за отсутствия требований: несоответствия версии TLS или отсутствия наборов шифров). Или проблема с маршрутизацией. Я не могу проверить ваш код, так что...

Jimi 17.08.2024 13:13

Хорошо, попробую проверить эти варианты подключения.

MUHAMMED DÖNMEZ 17.08.2024 13:17

Не забывайте всегда (-всегда-) указывать в своих сообщениях версию .NET, на которую вы ориентируетесь. По возможности добавляйте соответствующие теги. Поскольку это связано с общим подключением, также была протестирована версия системы, на которой был протестирован ваш код.

Jimi 17.08.2024 13:46
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
9
80
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Судя по предоставленному вами коду, URL-адрес http https://blabla.com/Images/ должен представлять собой веб-сервис, который принимает содержимое файла и сохраняет его в файловой системе сервера. URL-адрес http не может совпадать с путем, по которому вы хотите загрузить файл. Итак, вам нужно создать веб-сервис и развернуть его на сервере. И используйте этот веб-сервис в своем приложении Windows Form с помощью Rest Client. Вы можете выполнить поиск «Как написать веб-сервис для загрузки файла».

Альтернативно

Если вы хотите загружать файлы на сервер без создания веб-сервиса, вам необходимо использовать протокол FTP. Но на сервере ftp путь и учетные данные должны быть настроены. Затем вы можете использовать WebClient для FTP. Вы можете поискать больше об этом и легко найти множество примеров.

using (var client = new WebClient())
{
    client.Credentials = new NetworkCredential(ftpUsername, ftpPassword);
    client.UploadFile("ftp://ftphosturl/fileName", WebRequestMethods.Ftp.UploadFile, localFile);
}

Спасибо за ответ, я думаю, что это правильный способ загрузки файла. После настройки я постараюсь отредактировать код, чтобы он соответствовал протоколу FTP.

MUHAMMED DÖNMEZ 18.08.2024 01:26

@MUHAMMEDDÖNMEZ Если вас беспокоит безопасность, вы также можете использовать протокол SFTP, вы можете найти дополнительную информацию о SFTP и его примере. Пожалуйста, примите это как ответ, если это отвечает на ваш вопрос. Спасибо.

Priyank 18.08.2024 04:34

Конечно, приняли, еще раз спасибо, все работает отлично.

MUHAMMED DÖNMEZ 18.08.2024 10:30

Вы уверены, что хотите загружать файлы прямо на свой http? Лучше использовать ftp, поскольку файлы http имеют разрешения только на чтение. Или вы хотите использовать сценарий, например php, для проверки ваших учетных данных и обработки загрузки. Также ваш RestRequest неверен. используйте: var request = new RestRequest(Method.Post);

Спасибо за ответ, но сейчас код var request = new RestRequest(Method.Post.ToString());

MUHAMMED DÖNMEZ 18.08.2024 01:23

Никогда такого раньше не видел. ссылка

Paul Albers 18.08.2024 01:41

Еще раз спасибо, проблема решена, спасибо

MUHAMMED DÖNMEZ 18.08.2024 10:31

Другие вопросы по теме