List имеет значение null для больших файлов.C#

Место общения программистов C#
Ответить
Anonymous
 List имеет значение null для больших файлов.

Сообщение Anonymous »

У меня есть метод контроллера C#, который успешно принимает небольшие файлы, но когда я пытаюсь загрузить большой файл из клиента браузера, параметр «files» имеет значение null.
Я выполнил поиск в Интернете и добавил ограничение на размер запроса: -
[HttpPost]
[RequestSizeLimit(107374182400)]
public async Task PostFormData(List files, CancellationToken cancellationToken = default)

Я также пытался настроить ограничение в настройках приложения, json: -
"Kestrel": {
"Limits": {
"MaxRequestBodySize": 107374182400 // 100 GB example (1024*1024*1024)
}
}

Мне нужно сделать что-то еще?
Это JS-клиент: -
const abortControl = new AbortController();
const signal = abortControl.signal;
const fetchOpts = {signal:signal, method:'POST', body: fileHolder, cache:"no-cache"};
const response = fetch("https://localhost:7196/upload/PostFormData", fetchOpts).catch(
err => {
console.log("Upload failed: " + err.message);
return
})
if (signal.aborted) {
alert("Cancelled")
return
}

Размер файла — 10 737 418 240 байт — bigfile.txt
Тип контента по-прежнему представляет собой многочастный поток.
РЕДАКТИРОВАТЬ 1
Я хотел бы иметь возможность обрабатывать несколько файлов одновременно (полный код ниже). Тест на 10 ГБ был просто «тестом», чтобы доказать это. можно было бы сделать. Это редкое исключение, которое можно настроить.
Если я не могу использовать привязку [FromBody], что мне нужно изменить, если я выберу маршрут «Set MultipartBodyLengthLimit»?
[HttpPost]
[RequestSizeLimit(107374182400)]
public async Task PostFormData(List files, CancellationToken cancellationToken = default)
{
if (!Request.ContentType?.Contains("multipart/form-data") == true)
{
return BadRequest("Unsupported media type.");
}

if (files == null || files.Count maxTotalSize)
break;
}
if (totalBytes > maxTotalSize)
{
return BadRequest("Total File Size exceeds limit.");
}

var copyResults = new List();

var fileOptions = new FileStreamOptions()
{
Mode = FileMode.Create,
Access = FileAccess.ReadWrite,
Options = FileOptions.Asynchronous,
};

var loopOptions = new ParallelOptions { MaxDegreeOfParallelism = 3 };

await Parallel.ForEachAsync(files, loopOptions, async (file, _) =>
{
if (file.Length maxFileSize)
{
lock (_resultsLock)
{
copyResults.Add(new FileCopyStatus
{
FileName = file.FileName,
UploadStatus = (int)CopyStatus.Invalid,
Message = "File Size"
});
}
_logger.LogError("Invalid file copy for {file} prevented due to File Size", file.FileName);
}

// Check file.contentType and file.filename type

try
{
var filePath = Path.Combine(folder, file.FileName);
fileOptions.PreallocationSize = file.Length;

using (var stream = new FileStream(filePath, fileOptions))
{
await file.CopyToAsync(stream, cancellationToken);
}
lock (_resultsLock)
{
lock (_resultsLock)
{
copyResults.Add(new FileCopyStatus
{
FileName = file.FileName,
UploadStatus = (int)CopyStatus.Success
});
}
}
}
catch (TaskCanceledException)
{
lock (_resultsLock)
{
copyResults.Add(new FileCopyStatus
{
FileName = file.FileName,
UploadStatus = (int)CopyStatus.Cencelled
});
}
_logger.LogError("File copy for {file} cancelled.", file.FileName);
}
catch (Exception ex)
{
lock (_resultsLock)
{
copyResults.Add(new FileCopyStatus
{
FileName = file.FileName,
UploadStatus = (int)CopyStatus.Error,
Message = ex.Message
});
}
_logger.LogError(ex, "Error saving {file}", file.FileName);
}
});

if (cancellationToken.IsCancellationRequested)
{
}

return Ok(copyResults);
}


Подробнее здесь: https://stackoverflow.com/questions/798 ... arge-files
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»