Для отправки потоков с помощью HttpClient применяется класс StreamContent. Его конструктор в качестве обязательного
параметра принимает объект Stream
, то есть поток, данные которого отправляются на сервер. Рассмотрим на примере отправки в потоке данных какого-нибудь файла .
Для тестирования определим следующее веб-приложение ASP.NET Core:
var builder = WebApplication.CreateBuilder(); var app = builder.Build(); app.MapPost("/data", async(HttpContext httpContext) => { // путь к папке, где будут храниться файлы var uploadPath = $"{Directory.GetCurrentDirectory()}/uploads"; // создаем папку для хранения файлов Directory.CreateDirectory(uploadPath); // генерируем произвольное название файла с помощью guid string fileName = Guid.NewGuid().ToString(); // получаем поток using (var fileStream = new FileStream($"{uploadPath}/{fileName}.jpg", FileMode.Create)) { await httpContext.Request.Body.CopyToAsync(fileStream); } await httpContext.Response.WriteAsync("Данные сохранены"); }); app.Run();
Здесь с помощью метода app.MapPost()
определена одна конечная точка, которая обрабатывает POST-запросы по адресу "/data"/.
В обработчике конечной точки создаем каталог для загружаемых файлов - он будет называться "uploads" и будет располагаться в папке проекта.
И также генерируем произвольное имя файла с помощью Guid.NewGuid()
.
Все отправленные в запросе данные доступны через свойство httpContext.Request.Body
- оно представляет объект Stream, то есть по сути поток,
который будет отправляться на клиенте с помощью StreamContent. И чтобы сохранить из этого потока данные в файл, определяем объект FileStream и с помощью метода
CopyToAsync()
копируем данные из httpContext.Request.Body в FileStream (по сути в файл)
await httpContext.Request.Body.CopyToAsync(fileStream);
Здесь для теста просто предполагаем, что файл будет иметь расширение "jpg"
В конце посылаем в ответ клиенту некоторое диагностического сообщение.
В качестве клиента будет выступать следующее консольное приложение:
class Program { static HttpClient httpClient = new HttpClient(); static async Task Main() { // отправляемые данные string filePath = "D:\\forest.jpg"; using var fileStream = File.OpenRead(filePath); // создаем объект HttpContent StreamContent content = new StreamContent(fileStream); // отправляем запрос using var response = await httpClient.PostAsync("https://localhost:7094/data", content); // получаем ответ string responseText = await response.Content.ReadAsStringAsync(); Console.WriteLine(responseText); } }
В качестве теста здесь отправляется данные из файла "D:\\forest.jpg". Для отправки сначала создается поток FileStream, который представляет этот файл:
using var fileStream = File.OpenRead(filePath);
Далее этого поток передается в StreamContent:
StreamContent content = new StreamContent(fileStream);
Затем StreamContent отправляется на сервер в методе httpClient.PostAsync()
(в моем случае веб-приложение ASP.NET запущено по адресу "https://localhost:7094/").
В результате выполнения программы в проекте веб-приложения ASP.NET появится папка "uploads", а в нее будет сохранен файл:
Для отправки массива байтов применяется класс ByteArrayContent, конструктор которого в качестве обязательного параметра принимает массив байтов. Например, для простенького примера конвретируем строку в массив байтов и отправим на сервер:
class Program { static HttpClient httpClient = new HttpClient(); static async Task Main() { // отправляемые данные string message = "Hello METANIT.COM"; // считываем строку в массив байтов byte[] messageToBytes = System.Text.Encoding.UTF8.GetBytes(message); // формируем отправляемое содержимое var content = new ByteArrayContent(messageToBytes); // отправляем запрос using var response = await httpClient.PostAsync("https://localhost:7094/data", content); // получаем ответ string responseText = await response.Content.ReadAsStringAsync(); Console.WriteLine(responseText); } }
Здесь строку конвертируем в массив байтов с помощью метода System.Text.Encoding.UTF8.GetBytes()
. Для тестирования отправки м можно определить следующее
веб-приложение ASP.NET Core:
var builder = WebApplication.CreateBuilder(); var app = builder.Build(); app.MapPost("/data", async(HttpContext httpContext) => { // считываем полученные данные в строку using StreamReader streamReader = new StreamReader(httpContext.Request.Body); string message = await streamReader.ReadToEndAsync(); await httpContext.Response.WriteAsync($"Отправлено сообщение: {message}"); }); app.Run();