- Практическое руководство. Загрузка файлов в элемент управления RichTextBox в Windows Forms
- Загрузка файла в элемент управления RichTextBox
- См. также раздел
- Си шарп загрузка файла
- Загрузка одного файла
- Множественная отправка файлов
- Отправка смешанного содержимого
- Си шарп загрузка файла
- Выберите файл для загрузки
Практическое руководство. Загрузка файлов в элемент управления RichTextBox в Windows Forms
Элемент управления Windows Forms RichTextBox может отображать обычный текст, обычный текст в Юникоде или файл в формате RTF. Для этого вызовите метод LoadFile . Метод LoadFile можно также использовать для загрузки данных из потока. Дополнительные сведения см. в разделе LoadFile(Stream, RichTextBoxStreamType).
Загрузка файла в элемент управления RichTextBox
- Определить путь к открываемому файлу с помощью компонента OpenFileDialog . Его обзор приведен в статье Общие сведения о компоненте OpenFileDialog.
- Вызовите метод LoadFile элемента управления RichTextBox , указав загружаемый файл и при необходимости тип файла. В следующем примере загружаемый файл берется из свойства OpenFileDialog компонента FileName . Если вы вызываете метод с именем файла в качестве единственного аргумента, предполагается, что тип файла должен быть RTF. Чтобы указать другой тип файла, вызовите метод со значением перечисления RichTextBoxStreamType в качестве второго аргумента. В следующем примере компонент OpenFileDialog отображается при нажатии кнопки. Выбранный файл открывается и отображается в элементе управления RichTextBox . В этом примере предполагается, что форма содержит кнопку btnOpenFile .
Private Sub btnOpenFile_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnOpenFile.Click If OpenFileDialog1.ShowDialog() = DialogResult.OK Then RichTextBox1.LoadFile(OpenFileDialog1.FileName, _ RichTextBoxStreamType.RichText) End If End Sub
private void btnOpenFile_Click(object sender, System.EventArgs e) < if(openFileDialog1.ShowDialog() == DialogResult.OK) < richTextBox1.LoadFile(openFileDialog1.FileName, RichTextBoxStreamType.RichText); >>
private: void btnOpenFile_Click(System::Object ^ sender, System::EventArgs ^ e) < if(openFileDialog1->ShowDialog() == DialogResult::OK) < richTextBox1->LoadFile(openFileDialog1->FileName, RichTextBoxStreamType::RichText); > >
(Visual C#, Visual C++) Поместите следующий код в конструктор формы для регистрации обработчика событий.
this.btnOpenFile.Click += new System.EventHandler(this. btnOpenFile_Click);
this->btnOpenFile->Click += gcnew System::EventHandler(this, &Form1::btnOpenFile_Click);
Важно! Для запуска этого процесса сборке может потребоваться уровень привилегий, предоставляемый классом System.Security.Permissions.FileIOPermission . При выполнении в контексте частичного доверия процесс может выдавать исключение из-за недостаточных привилегий. Дополнительные сведения см. в разделе Code Access Security Basics.
См. также раздел
Си шарп загрузка файла
Для отправки файлов на сервер HttpClient использует класс System.Net.Http.MultipartFormDataContent . Фактически этот класс выступает в качестве контейнера объектов HttpContent. А для добавления элементов в MultipartFormDataContent применяется метод Add()
public void Add(HttpContent content, string name, string fileName);
Первый параметр — отправляемое содержимое (это может быть как файлы, так и любые другие данные). Второй параметр — name определяет название данных в запросе, по которому мы можем получить файл на сервере. Третий параметр — fileName устанавливает имя файла.
Загрузка одного файла
Для тестирования загрузки файла определим приложение ASP.NET Core со следующим кодом:
var builder = WebApplication.CreateBuilder(); var app = builder.Build(); app.MapPost("/upload", async (HttpContext context) => < // получем коллецию загруженных файлов IFormFileCollection files = context.Request.Form.Files; // путь к папке, где будут храниться файлы var uploadPath = $"/uploads"; // создаем папку для хранения файлов Directory.CreateDirectory(uploadPath); // пробегаемся по всем файлам foreach (var file in files) < // формируем путь к файлу в папке uploads string fullPath = $"/"; // сохраняем файл в папку uploads using (var fileStream = new FileStream(fullPath, FileMode.Create)) < await file.CopyToAsync(fileStream); >> await context.Response.WriteAsync("Файлы успешно загружены"); >); app.Run();
Здесь метод app.MapPost() определяет конечную точку, которая обрабатывает запросы по пути «\upload». В обработчике конечной точки в качестве параметра получаем контекст запроса HttpContext и через него с помощью свойства context.Request.Form.Files получаем коллекцию загруженных файлов. Далее пробегаемся по этой коллекции и сохраняем все данные в проекте в папке «upoload» (если ее нет, она создается).
using System.Net.Http.Headers; class Program < static HttpClient httpClient = new HttpClient(); static async Task Main() < // адрес сервера var serverAddress = "https://localhost:7094/upload"; // пусть к файлу var filePath = @"D:\forest.jpg"; // создаем MultipartFormDataContent using var multipartFormContent = new MultipartFormDataContent(); // Загружаем отправляемый файл var fileStreamContent = new StreamContent(File.OpenRead(filePath)); // Устанавливаем заголовок Content-Type fileStreamContent.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg"); // Добавляем загруженный файл в MultipartFormDataContent multipartFormContent.Add(fileStreamContent, name: "file", fileName: "forest.jpg"); // Отправляем файл using var response = await httpClient.PostAsync(serverAddress, multipartFormContent); // считываем ответ var responseText = await response.Content.ReadAsStringAsync(); Console.WriteLine(responseText); >>
Итак, в моем случае веб-приложение запущено по адресу «»https://localhost:7094/», поэтому для обращения к конечной точке, которая получает файлы, я использую адрес «»https://localhost:7094/upload». Также в моем случае загружается файл «D:\forest.jpg».
Для отправки создаем MultipartFormDataContent
using var multipartFormContent = new MultipartFormDataContent();
Обратите внимание на конструкцию using, которая позволит закрыть все связанные с объектом потоки, использованные при отправке файла.
Затем создаем объект StreamContent , который получает содержимое файла в виде файлового потока:
var fileStreamContent = new StreamContent(File.OpenRead(filePath));
Устанавливаем mime-тип, который соответствует загружаемому файлу:
fileStreamContent.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg");
Далее добавляем этот объект в MultipartFormDataContent:
multipartFormContent.Add(fileStreamContent, name: "file", fileName: "forest.jpg");
В конце отправляем файл и получаем ответ:
using var response = await httpClient.PostAsync(serverAddress, multipartFormContent); var responseText = await response.Content.ReadAsStringAsync();
Стоит отметить, что нам необязательно применять для отправки файла именно StreamContent. Например, можно считать данные файла в массив байтов и отправить его, используя класс ByteArrayContent :
using System.Net.Http.Headers; class Program < static HttpClient httpClient = new HttpClient(); static async Task Main() < // адрес сервера var serverAddress = "https://localhost:7094/upload"; // пусть к файлу var filePath = @"D:\forest.jpg"; // создаем MultipartFormDataContent using var multipartFormContent = new MultipartFormDataContent(); // считываем данные файла в массив байтов byte[] fileToBytes = await File.ReadAllBytesAsync(filePath); // формируем отправляемое содержимое var content = new ByteArrayContent(fileToBytes); // Устанавливаем заголовок Content-Type content.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg"); // Добавляем загруженный файл в MultipartFormDataContent multipartFormContent.Add(content, name: "file", fileName: "forest5.jpg"); // Отправляем файл using var response = await httpClient.PostAsync(serverAddress, multipartFormContent); // считываем ответ var responseText = await response.Content.ReadAsStringAsync(); Console.WriteLine(responseText); >>
Код сервера при этом остается тем же.
Множественная отправка файлов
Подобным образом можно отправлять и большее количество файлов. Например:
using System.Net.Http.Headers; class Program < static HttpClient httpClient = new HttpClient(); static async Task Main() < // адрес для отправки var serverAddress = "https://localhost:7094/upload"; // пути к файлам var files = new string[] < "D:\forest.jpg", "D:\cats.jpg" >; using var multipartFormContent = new MultipartFormDataContent(); // в цикле добавляем все файлы в MultipartFormDataContent foreach (var file in files) < // получаем краткое имя файла var fileName = Path.GetFileName(file); var fileStreamContent = new StreamContent(File.OpenRead(file)); fileStreamContent.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg"); multipartFormContent.Add(fileStreamContent, name: "files", fileName: fileName); >// Отправляем файлы using var response = await httpClient.PostAsync(serverAddress, multipartFormContent); // считываем ответ var responseText = await response.Content.ReadAsStringAsync(); Console.WriteLine(responseText); > >
Отправка смешанного содержимого
Плюсом MultipartFormDataContent состоит в том, что он позволяет отправить смешенного содержимое, не только файлы. Например, пусть у нас веб-приложение ASP.NET получает некоторые данные:
using Microsoft.AspNetCore.Mvc; var builder = WebApplication.CreateBuilder(); var app = builder.Build(); app.MapPost("/upload", async (HttpContext context) => < var form = context.Request.Form; // получаем отдельные данные string? username = form["username"]; string? email = form["email"]; // получаем коллецию загруженных файлов IFormFileCollection files = form.Files; // путь к папке, где будут храниться файлы var uploadPath = $"/uploads"; // создаем папку для хранения файлов Directory.CreateDirectory(uploadPath); foreach (var file in files) < // путь к папке uploads string fullPath = $"/"; // сохраняем файл в папку uploads using (var fileStream = new FileStream(fullPath, FileMode.Create)) < await file.CopyToAsync(fileStream); >> return $"Данные пользователя () успешно загружены"; >); app.Run();
На сервере теперь из коллекции context.Request.Form получаем данные с ключом «username» и «email» (условные имя и электронный адрес пользователя).
На клиенте определим следующий код:
using System.Net.Http.Headers; class Program < static HttpClient httpClient = new HttpClient(); static async Task Main() < using var multipartFormContent = new MultipartFormDataContent(); // добавляем обычные данные multipartFormContent.Add(new StringContent("Tom"), name: "username"); multipartFormContent.Add(new StringContent("tom@localhost.com"), name: "email"); // добавляем файл var fileStreamContent = new StreamContent(File.OpenRead("D:\logo.jpg")); fileStreamContent.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg"); multipartFormContent.Add(fileStreamContent, name: "files", fileName: "logo.jpg"); // Отправляем данные using var response = await httpClient.PostAsync("https://localhost:7094/upload", multipartFormContent); // считываем ответ var responseText = await response.Content.ReadAsStringAsync(); Console.WriteLine(responseText); >>
В данном случае кроме файла в MultipartFormDataContent добавляется два объекта StringContent, который представляет обычную строку. Ключи обоих объектов соответствуют тем, которые используются для получения данных на сервере — «username» и «email».
В результате выполнения консоль нам выведет:
Данные пользователя Tom (tom@localhost.com) успешно загружены
А на сервере в папке uploads появится еще один файл — logo.jpg.
Си шарп загрузка файла
Рассмотрим, как загружать файлы на сервер в ASP.NET Core. Все загружаемые файлы в ASP.NET Core представлены типом IFormFile из пространства имен Microsoft.AspNetCore.Http . Соответственно для получения отправленного файла в контроллере необходимо использовать IFormFile. Затем с помощью методов IFormFile мы можем произвести различные манипуляции файлом — получит его свойства, сохранить, получить его поток и т.д. Некоторые его свойства и методы:
- ContentType : тип файла
- FileName : название файла
- Length : размер файла
- CopyTo/CopyToAsync : копирует файл в поток
- OpenReadStream : открывает поток файла для чтения
Для тестирования данной возможности определим в проекте папку html , в которой создадим файл index.html
Определим в файле index.html следующий код:
Выберите файл для загрузки
В данном случае форма содержит набор элементов с типом file , через которые можно выбрать файлы для загрузки. В данном случае на форме три таких элемента, но их может быть и меньше и больше. А благодаря установке атрибута формы enctype=»multipart/form-data» браузер будет знать, что вместе с формой надо передать файлы.
Отправляться файлы будут в запросе типа POST на адрес «/upload».
Теперь в файле Program.cs определим код, который будет получать загружаемые файлы:
var builder = WebApplication.CreateBuilder(); var app = builder.Build(); app.Run(async (context) => < var response = context.Response; var request = context.Request; response.ContentType = "text/html; charset=utf-8"; if (request.Path == "/upload" && request.Method=="POST") < IFormFileCollection files = request.Form.Files; // путь к папке, где будут храниться файлы var uploadPath = $"/uploads"; // создаем папку для хранения файлов Directory.CreateDirectory(uploadPath); foreach (var file in files) < // путь к папке uploads string fullPath = $"/"; // сохраняем файл в папку uploads using (var fileStream = new FileStream(fullPath, FileMode.Create)) < await file.CopyToAsync(fileStream); >> await response.WriteAsync("Файлы успешно загружены"); > else < await response.SendFileAsync("html/index.html"); >>); app.Run();
Здесь если запрос приходит по адресу «/upload», а сам запрос представляет запрос типа POST, то приложение получает коллекцию загруженных файлов с помощью свойства Request.Form.Files , которое представляет тип IFormFileCollection :
IFormFileCollection files = request.Form.Files;
Далее определяем каталог для загружаемых файлов (предполагается, что файлы будут храниться в каталоге «uploads», которая располагается в папке приложения)
Если такой папки нет, то создаем ее. Затем перебираем всю коллекцию файлов.
foreach (var file in files)
Каждый отдельный файл в этой коллекции представляет тип IFormFile. Для копирования файла в нужный каталог создается поток FileStream, в который записывается файл с помощью метода CopyToAsync .
using (var fileStream = new FileStream(fullPath, FileMode.Create))
Если запрос идет по другому адресу и/или не представляет тип POST, то отправляем клиенту html-страницу index.html .
Обратимся к приложению и выберем файлы для загрузки:
И после успешной загрузки нам отобразиться соответствующее сообщение:
А в каталоге проекта будет создана папка uploads, в которой появятся загуженные файлы: