дизайнеры приложений часто сталкиваются с вопросом о том, хранить ли большие объекты в файловой системе или в базе данных. Часто это решение принимается для простоты дизайна приложений. Иногда также используются измерения производительности. В этой статье рассматривается вопрос о фрагментации - одной из операционных проблем, которые могут повлиять на производительность и/или управляемость системы, как развернутую долгосрочную перспективу. Как и ожидалось от общей мудрости, объекты меньше 256 тыс. Лучше всего хранятся в базе данных, в то время как объекты, более 1 млн, лучше всего хранятся в файловой системе. Между 256K и 1 м, коэффициент чтения: записи и скорость перезапись объектов или замены являются важными факторами. Мы использовали понятие «возраста хранения» или количество перезаписей объектов как способ нормализации времени на стенке. Возраст хранения позволяет нашим результатам или аналогичным результатам применяться по ряду коэффициентов чтения: записи и скорости замены объектов.
, что, в свою очередь, я решил реализовать FileStream в обработке больших файлов. Логика сравнения размера файлов? Это означает, что файлы меньше 256K считаются небольшими размерами файлов, в то время как файлы, превышающие 1 м , считаются большими размерами файлов. Я думаю, что 1m эквивалентен 1 МБ . Я полагаю, что этот вопрос имеет связь с этой статьей: ASP.NET CORE Blazor Dults File. Применить и отфильтровать предел размера файла, который должен быть собран и сохранен, например, чтобы предотвратить загрузку больших файлов: < /p>
Код: Выделить всё
@page "/to-my-page"
@rendermode InteractiveServer
@using Microsoft.EntityFrameworkCore
@using MyProject.Models.SQLServer
@using MyProject.Data.SQLServer
@implements IAsyncDisposable
@inject IDbContextFactory DbFactory
@inject NavigationManager NavigationManager
@inject IJSRuntime JS
@if (myModel.Img is not null)
{
[img]@myModel.Img[/img]
}
Save
@code {
[SupplyParameterFromForm]
private MyModel myModel { get; set; } = new();
private SQLServerContext context = default!;
private string? output;
protected override void OnInitialized()
{
context = DbFactory.CreateDbContext();
}
private async Task HandleImageUpload(InputFileChangeEventArgs e)
{
long threeMB = 3L * 1024L * 1024L; //3 MB limit
var file = e.File;
var stream = file.OpenReadStream(maxAllowedSize: threeMB);
var buffer = new byte[file.Size];
await stream.ReadAsync(buffer);
var base64 = Convert.ToBase64String(buffer);
myModel.Img = $"data:{file.ContentType};base64,{base64}";
}
private async Task SimulateImg()
{
var sQLServerHelper = new SQLServerHelper(context);
string testID = "test-id";
byte[]? testImg = SQLServerInnerHelper.TryExtractImageBytes(myModel.Img);
var spParam = SQLServerInnerHelper.ManageImageDataWOutputParams(
testID: testID,
testImg: testImg,
functionKey: "SIMULATE_TEST_IMAGE");
output = await sQLServerHelper.SimulateImgStringOutputAsync("mySP", spParam);
if (output is not null && output == "SUCCESSFUL")
{
await JS.InvokeVoidAsync("showLiveToast");
}
else if (output is not null && output != "SUCCESSFUL")
{
await JS.InvokeVoidAsync("showLiveToastError");
}
else
{
await JS.InvokeVoidAsync("showLiveToastError");
}
}
public async ValueTask DisposeAsync()
{
await context.DisposeAsync();
}
}
Мой вопрос:
[*] Можно эти фигуры, меньше, чем применение, применение, применение, и больше, чем 1m . Логика? Я не получил точку настройки этого: var stream = file.openreadstream (maxAllowedSize: threemb); Если это не ведут не так, как ожидалось, поэтому мне нужно было рефакторировать код в это:
Код: Выделить всё
private async Task HandleImageUpload(InputFileChangeEventArgs e)
{
long threeMB = 3L * 1024L * 1024L; //3 MB limit
var file = e.File;
if (file.Size > threeMB)
{
await JS.InvokeVoidAsync("showLiveToastError");
}
else
{
var stream = file.OpenReadStream(maxAllowedSize: threeMB);
var buffer = new byte[file.Size];
await stream.ReadAsync(buffer);
var base64 = Convert.ToBase64String(buffer);
myModel.Img = $"data:{file.ContentType};base64,{base64}";
}
}
Я ожидал этого:
Чтение одного файла или множества файлов, более 500 Kb (3 MB). /> < /blockquote>
Примечание: исключение не мешает во время выполнения, и я не заметил, что до тех пор, пока я не проверил консоль отладки < /code>. < /p>
Согласно пользователю здесь, SO, рефакторированный код несколько хорош, но я не знаю, как оптимизировать и избегать чтения поток в имене в память. сам. Поэтому я спросил ИИ, и это дало мне этот ответ: < /p>
Код: Выделить всё
private async Task HandleFileSelected(InputFileChangeEventArgs e)
{
IBrowserFile file = e.File;
// Max file size limit, e.g., 10 MB
long maxFileSize = 10 * 1024 * 1024;
// Full path where you want to save the file
var path = Path.Combine("UploadedFiles", file.Name); // make sure folder exists
// Create a stream to write the uploaded file to the server disk
await using FileStream fs = new(path, FileMode.Create);
// Stream the uploaded file directly into the FileStream (no full memory load)
await file.OpenReadStream(maxFileSize).CopyToAsync(fs);
}
Как оптимизировать и рефактор кода, чтобы избежать чтения потока входящего файла в память, все это за все это будет? Используется в принятии решений для этой концепции: < /p>
вне обработки небольшого файла, избегайте чтения входящего файла
потока непосредственно в память одновременно. Например, не копируйте все
байтов файла в MemoryStream и не читайте весь поток в массив байтов
A все сразу. Эти подходы могут привести к деградированному приложению
производительности и потенциальному отрицанию риска обслуживания (DOS), особенно для компонентов на стороне сервера
. Вместо этого рассмотрите возможность принятия любого из следующих подходов
: < /p>
Скопируйте поток непосредственно в файл на диске, не читая его в память. Обратите внимание, что приложения Blazor, выполняющие код на сервере, не в состоянии
напрямую доступ к файловой системе клиента. Для получения дополнительной информации см. Файлы загрузки в раздел внешней службы. Если вы найдете недостающую тему, которая упоминается в разделе комментариев, см. В этом посте.
Подробнее здесь: https://stackoverflow.com/questions/797 ... d-a-databa
Мобильная версия