C# Сохранение на сервере больших файлов в потоке, передача через Httpclient
Подскажите, как правильно сделать сохранение больших файлов на сервере, к примеру, в 2гб.
Я использую код, который работает с небольшими файлами, а в случае с передачей файла в 2гб я получаю ошибку:
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware[1]
An unhandled exception has occurred while executing the request.
System.IO.IOException: Stream was too long.
Так же пробовал сделать сохранение файлов отправкой частей файла на сервер, но запросов выходит слишком много, и скорость сохранения ниже, так как много подключений идёт к серверу.
Код для отправки файла:
private async void button6_Click(object sender, EventArgs e)
{
string url = "https://localhost:5001/uploadfile";
await SendFile(Path, url);
textBox1.AppendText("Готово");
}
public async Task SendFile(string filePath, string url)
{
// Открываем файл для чтения
using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
// Создаем объект HttpClient
using (HttpClient client = new HttpClient())
{
// Создаем объект MultipartFormDataContent для передачи файла
using (MultipartFormDataContent content = new MultipartFormDataContent())
{
// Создаем объект StreamContent для передачи содержимого файла
using (StreamContent fileContent = new StreamContent(fileStream))
{
// Добавляем содержимое файла к объекту MultipartFormDataContent
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("Произошла ошибка при передаче файла.");
}
}
}
}
}
}
Код для сохранения файла с потока:
public class FileController : Controller
{
[RequestFormLimits(MultipartBodyLengthLimit = (long)4e+9)]
[HttpPost("/uploadfile")]
// [RequestFormLimits(MultipartBodyLengthLimit = 209715200)]
public async Task<IActionResult> UploadFile()
{
var maxRequestBodySize = (long)4e+9; // установка максимального размера тела запроса в байтах
HttpContext.Features.Get<IHttpMaxRequestBodySizeFeature>().MaxRequestBodySize = maxRequestBodySize;
// Получаем поток данных из запроса
using var stream = new MemoryStream();
await Request.Body.CopyToAsync(stream);
stream.Seek(0, SeekOrigin.Begin);
// Считываем данные из потока по частям и сохраняем их в файл на сервере
using var fileStream = new FileStream("test.rar", FileMode.Create);
var buffer = new byte[1024 * 50];
int bytesRead;
while ((bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length)) > 0)
{
await fileStream.WriteAsync(buffer, 0, bytesRead);
}
await fileStream.FlushAsync();
return Ok();
}
}
Источник: Stack Overflow на русском