C# Сохранение на сервере больших файлов в потоке, передача через Httpclient

Рейтинг: 0Ответов: 0Опубликовано: 25.06.2023

Подскажите, как правильно сделать сохранение больших файлов на сервере, к примеру, в 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();
        }
    }

Ответы

Ответов пока нет.