Я закончил приложение на С#, используя 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); с этим imageBox1.Image = Image.FromStream(new MemoryStream(File.ReadAllBytes(ofd.FileName)), true, false); и результат тот же. Не удалось загрузить изображение.
Не удалось, почему? Из-за того же System.IO.IOException? Или что-то еще?
Нет, это не то же самое System.IO.IOException, это из условия if в этой строке, если (response.StatusCode == System.Net.HttpStatusCode.OK) StatusCode равен 0
Итак, растровое изображение теперь загружено правильно. Если StatusCode равен 0, у вас есть ответ на соединение FIN: соединение закрыто.
Вы имеете в виду, что я не могу правильно добраться до пути? (на стороне сервера)..
Означает, что соединение было корректно закрыто. Возможно, произошел сбой обмена протоколом SSL (подтверждение TLS может завершиться неудачно из-за отсутствия требований: несоответствия версии TLS или отсутствия наборов шифров). Или проблема с маршрутизацией. Я не могу проверить ваш код, так что...
Хорошо, попробую проверить эти варианты подключения.
Не забывайте всегда (-всегда-) указывать в своих сообщениях версию .NET, на которую вы ориентируетесь. По возможности добавляйте соответствующие теги. Поскольку это связано с общим подключением, также была протестирована версия системы, на которой был протестирован ваш код.
Судя по предоставленному вами коду, 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.
@MUHAMMEDDÖNMEZ Если вас беспокоит безопасность, вы также можете использовать протокол SFTP, вы можете найти дополнительную информацию о SFTP и его примере. Пожалуйста, примите это как ответ, если это отвечает на ваш вопрос. Спасибо.
Конечно, приняли, еще раз спасибо, все работает отлично.
Вы уверены, что хотите загружать файлы прямо на свой http?
Лучше использовать ftp, поскольку файлы http имеют разрешения только на чтение. Или вы хотите использовать сценарий, например php, для проверки ваших учетных данных и обработки загрузки.
Также ваш RestRequest неверен.
используйте: var request = new RestRequest(Method.Post);
Спасибо за ответ, но сейчас код var request = new RestRequest(Method.Post.ToString());
Никогда такого раньше не видел. ссылка
Еще раз спасибо, проблема решена, спасибо
Для начала переместите это:
pictureBox1.Image = new Bitmap(ofd.FileName);
после блокаusing
Stream. Или не используйтеnew Bitmap()
, вместо этогоImage.FromStream(new MemoryStream(File.ReadAllBytes(ofd.FileName)), true, false)
. Создание растрового изображения с помощьюnew Bitmap()
блокирует файл на диске.