Подскажите как я могу сделать чтобы в рамках одного запроса через httpclient я мог передать составной запрос из нескольких файлов в потоке. Сейчас я могу передать в потоке один файл и сохранить его на сервере.
Код для отправки файла со стороны клиента
public async Task SendFile(string filePath, string url)
{
using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
using (HttpClient client = new HttpClient())
{
client.Timeout = TimeSpan.FromMinutes(10);
// Создаем объект MultipartFormDataContent для передачи файла
using (MultipartFormDataContent content = new MultipartFormDataContent())
{
// Создаем объект StreamContent для передачи содержимого файла
using (StreamContent fileContent = new StreamContent(fileStream))
{
client.DefaultRequestHeaders.Add("Token", "1234");
content.Add(fileContent, "file", System.IO.Path.GetFileName(filePath));
// Отправляем запрос на сервер с помощью метода HTTP POST
HttpResponseMessage response = await client.PostAsync(url, content);
// Получаем ответ от сервера и проверяем его статусный код
if (response.IsSuccessStatusCode)
{
Console.WriteLine("Файл успешно передан.");
}
else
{
Console.WriteLine("Произошла ошибка при передаче файла.");
}
}
}
}
}
}
Код для сохранения файла с потока
[HttpPost("/uploadfile")]
//[DisableRequestSizeLimit]
[RequestSizeLimit((long)1e+10)]
[RequestFormLimits(MultipartBodyLengthLimit = (long)1e+10)]
public async Task<IActionResult> UploadFile()
{
if (!Request.HasFormContentType || !MediaTypeHeaderValue.TryParse(Request.ContentType, out var mediaTypeHeader) || string.IsNullOrEmpty(mediaTypeHeader.MediaType))
return new UnsupportedMediaTypeResult();
Stopwatch stopwatch = Stopwatch.StartNew();
using var fileStream = new FileStream("test.rar", FileMode.Create);
var buffer = new byte[1024 * 50];
int bytesRead;
while ((bytesRead = await Request.Body.ReadAsync(buffer, 0, buffer.Length)) > 0)
{
await fileStream.WriteAsync(buffer, 0, bytesRead);
}
stopwatch.Stop();
Console.WriteLine($"Время работы сохранения файла: {stopwatch.ElapsedMilliseconds}");
return Ok();
}
.CopyToAsync– aepot Jun 26 '23 at 21:13var formCollection = await Request.ReadFormAsync();и сохранять как.CopyToAsyncто скорость записи достигает до 700мб\с через буфер скорость записи до 55мб\с и через буфер нагрузка и в отладке меньше идет чем черезCopyToAsyncи в мсдн читал что свыше 64кб данные кешируются во временные файлы для обработки к примеру от туда и скорость в 700мб у процесса. Ваш код по ссылке читал раннее, хороший материал для изучения.И использовать для этого 2 разные машины,А почему на одной не желательно? – xellan Jun 26 '23 at 21:45CopyToAsyncвнутри себя использует точно такой же буфер и цикл. Только там оптимизаций внутри побольше, чем в вашем коде. Но если вы считаете, что ваш код эффективнее, чем написаный профессионалами внутри .NET библиотек - ваше право. – aepot Jun 27 '23 at 12:09