Форум программистов, компьютерный форум, киберфорум
C#: Web, ASP.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.73/22: Рейтинг темы: голосов - 22, средняя оценка - 4.73
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771

Проблемы с памятью при отправке и получении файлов (stream) wasm, minimal api

10.03.2022, 11:01. Показов 5010. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
net6, minimal api
Файл отправляется так и в принципе проблем не наблюдал с этим.
C#
1
2
3
4
5
app.MapGet("/api/v1/TestFile", GetTestFile);
internal async Task<IResult> GetTestFile(IReportService service)
{
      return Results.Stream(await service.GetTestFile(), "application/octet-stream", "training_8_3_20_1613.zip");
}
net6, blazor wasm
Скачивание файла.
C#
1
2
3
4
5
6
7
8
9
10
11
    private async void load()
    {
        var fileStream = await httpClient.GetStreamAsync("api/v1/TestFile");
        var fileName = "log.bin";
 
        using var streamRef = new DotNetStreamReference(stream: fileStream);
 
        await JS.InvokeVoidAsync("downloadFileFromStream", fileName, streamRef);
        await fileStream.DisposeAsync();
        streamRef.Dispose();
    }
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    async function downloadFileFromStream(fileName, contentStreamReference) {
    const arrayBuffer = await contentStreamReference.arrayBuffer();
    const blob = new Blob([arrayBuffer]);
    const url = URL.createObjectURL(blob);
 
    triggerFileDownload(fileName, url);
 
    URL.revokeObjectURL(url);
}
 
function triggerFileDownload(fileName, url) {
    const anchorElement = document.createElement('a');
    anchorElement.href = url;
    anchorElement.download = fileName ?? '';
    anchorElement.click();
    anchorElement.remove();
}
С файлом ~400МБ жрет и не возвращает 1.6 гиг.

Документация, по которой это было сделано
С отправкой файлов таже история.
На win form проверил - там все ок, 18 мб уходит.
Что не так с этим wasm и как с эим бороться?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.03.2022, 11:01
Ответы с готовыми решениями:

(Vk API) Не могу получить нужный ответ при отправке фото/документов/файлов на сервер upload.php
Итак мучаюсь 5 дней! Delphi я недавно начал изучать поэтому пока я быдлокодер но я учусь! Все способы перепробовал которые есть в...

Кодировка при отправке и получении письма
Добрый день ! Подскажите по кодировке - при получении письма тема:&quot;Сообщение&quot; на русском, а вот текст сообщения (то что в переменной sl)...

Ошибка при получении 2ого ответа от сервера invalid stream header
Имеется клиент и сервер, клиент отправляет сообщение, сервер принимает данное сообщение, добавляет его в лист-модель и отправляет клиенту...

31
 Аватар для sau
2875 / 2080 / 386
Регистрация: 22.07.2011
Сообщений: 7,837
14.03.2022, 14:37
Студворк — интернет-сервис помощи студентам
onimor, вот современный вариант через fetch , в IE не поддерживается.

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
const formData = new FormData();
const fileField = document.querySelector('input[type="file"]');
formData.append('filename', fileField.files[0]);
 
try {
  const response = await fetch('https://myserver/api/testfile', {
    method: 'POST',
    body: formData
  });
  const result = await response.json();
  console.log('Успех:', JSON.stringify(result));
} catch (error) {
  console.error('Ошибка:', error);
}
1
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
14.03.2022, 14:58  [ТС]
Цитата Сообщение от sau Посмотреть сообщение
вот современный вариант через fetch
что-то не понимаю как это работает, как туда попадает файл.
0
 Аватар для sau
2875 / 2080 / 386
Регистрация: 22.07.2011
Сообщений: 7,837
14.03.2022, 15:59
onimor,
Цитата Сообщение от onimor Посмотреть сообщение
что-то не понимаю как это работает, как туда попадает файл.
сам файл браузер будет передавать , нам нужно лишь сослаться на экземпляр обьекта описывающий файл.
fileField.files - это проперти возвращает FileList обьект , там разумеется не сам файл а лишь метаданные.
https://developer.mozilla.org/... ta_Objects - п.с XMLHttpRequest устаревшее апи , сейчас fetch ему на замену пришел.
ну и пользователь должен файл на форме выбрать , инфа о котором попадает в специальный input type="file"

тот код , что я выше скинул , его нужно в функцию обернуть , которую дернуть через jsRuntime в нужный момент - это если с блазором скрещивать. , потому как форма не сразу отрендерится.
а на стороне апи будет что-то вроде
public ActionResult TestFile(IFormFile filename)
1
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
15.03.2022, 09:33  [ТС]
sau, кажется я все еще не догоняю как это сделать
от api получаю 404
C#
1
app.MapPost("/api/TestFile",async (IFormFile file) =>
Ошибка: SyntaxError: Unexpected end of JSON input

Добавлено через 12 минут
Если у кого-то такие же беды при работе с файлами, вы может проявить интерес к проблеме, чтобы ms все таки что-то с этим сделали в net7
https://github.com/dotnet/aspnetcore/issues/40658
0
 Аватар для sau
2875 / 2080 / 386
Регистрация: 22.07.2011
Сообщений: 7,837
15.03.2022, 12:16
Цитата Сообщение от onimor Посмотреть сообщение
app.MapPost("/api/TestFile",async (IFormFile file)
имя параметра совпадает с параметром формы ?
0
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
15.03.2022, 12:44  [ТС]
Цитата Сообщение от sau Посмотреть сообщение
имя параметра совпадает с параметром формы ?
да, везде file
0
 Аватар для sau
2875 / 2080 / 386
Регистрация: 22.07.2011
Сообщений: 7,837
15.03.2022, 13:41
ну , могу лишь сказать что это работает в общем случае , что конкретно у вас не так - нужно смотреть предметнее , может ваше апи недоступно , может не так вызываете или не те параметры передаете , обычно в таких случаях 404-й код. Создайте учебный проект отдельный.

Unexpected end of JSON input
- а какой результат ваше апи возвращает ? , если не json , то это await response.json(); нужно переписать.


onimor, для Minimal api нужно в качестве аргумента указать HttpRequest, оно не умеет к IFormFile преобразовывать , либо используйте классический api контроллер.
0
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
15.03.2022, 15:14  [ТС]
Цитата Сообщение от sau Посмотреть сообщение
для Minimal api нужно в качестве аргумента указать HttpRequest,
Да, но теперь файл 1кб весит после получения, наверное передается что-то не то....
Я уже почти решился переходить на server side
0
 Аватар для sau
2875 / 2080 / 386
Регистрация: 22.07.2011
Сообщений: 7,837
15.03.2022, 15:44
Лучший ответ Сообщение было отмечено onimor как решение

Решение

onimor,
C#
1
2
3
4
5
6
7
app.MapPost("/api/TestFile", async (HttpRequest request) =>
{
    using var stream = request.Form.Files[0].OpenReadStream();
    using var fstream = System.IO.File.Create(request.Form.Files[0].FileName);
    await stream.CopyToAsync(fstream);
    return Results.Ok();
});
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
   
async function SendFile ()
{
    const formData = new FormData();
    const fileField = document.querySelector('input[type="file"]');
    formData.append('filename', fileField.files[0]);
    const response = await fetch("/api/TestFile",
    {
         method: 'POST',
         body: formData
    });
}
Цитата Сообщение от onimor Посмотреть сообщение
Я уже почти решился переходить на server side
а у вас сейчас проблема не имеет отношения к блейзору в целом ) , тут же обычный js и обычный rest api , просто есть нюансы у минимал.апи , но мы их уже разрешили . теперь остается разобраться чего там у вас на клиенте в браузере , примеры выше в обычной ситуации работают. Может у вас там несколько инпутов с типом file ?
1
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
16.03.2022, 09:00  [ТС]
Цитата Сообщение от sau Посмотреть сообщение
а у вас сейчас проблема не имеет отношения к блейзору в целом )
только появилась она из-за кривой работы стримов в wasm

Цитата Сообщение от sau Посмотреть сообщение
Может у вас там несколько инпутов с типом file ?
Да вроде как один. Щас попробую по разному

Добавлено через 25 минут
sau, я немного не от туда пытался получить файл ))))))
вообщем работает, иногда отъедает по 1мб , с любыми файлами. Но вот файлы больше ~50мб уже не уходят. Там видимо какое то ограничение на размер запроса что ли , получаю 413.
При 413 всегда отъедает по ~1мб

Добавлено через 2 минуты
я думаю увеличить разрешенный размер можно, но на сколько это хорошая идея.
0
 Аватар для sau
2875 / 2080 / 386
Регистрация: 22.07.2011
Сообщений: 7,837
16.03.2022, 12:57
Цитата Сообщение от onimor Посмотреть сообщение
я думаю увеличить разрешенный размер можно, но на сколько это хорошая идея
maxAllowedContentLength в конфиг файле если для IIS
MaxRequestBodySize в опциях для kestler варианта
DisableRequestSizeLimitAttribute - для методов api контроллера (у минимал api не пробовал)
1
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
17.03.2022, 11:40  [ТС]
Цитата Сообщение от sau Посмотреть сообщение
maxAllowedContentLength в конфиг файле если для IIS
MaxRequestBodySize в опциях для kestler варианта
DisableRequestSizeLimitAttribute - для методов api контроллера (у минимал api не пробовал)
Сработало только
C#
1
2
3
4
builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.MaxRequestBodySize = 524288000;
});
Но теперь если файл больше ~160 мб получаю 500 ошибку

Добавлено через 2 минуты
А ну понятно
An unhandled exception has occurred while executing the request.
System.IO.InvalidDataException: Multipart body length limit 134217728 exceeded.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.03.2022, 11:40

Vk api ошибка при получении последнего поста
Пробую получить коментари из групы ВК import requests import json proxies = {&quot;https&quot;: &quot;188.40.141.216:3128&quot;} token= '????' ...

Проблемы кодировки при получении письма
Всем привет )) Пытаюсь прочитать мои не прочитаные сообщения из mail.ru. Всё получается читается всё нормально. Кроме писем от яндекс...

Проблемы с кодировкой при получении данных из БД
Приветствую. Проблема в следующем: есть БД SQLite3, в ней таблица, которая заполнена значениями на кириллице. Когда я выгружаю эти данные...

Проблемы с русским текстом при получении его из полей
Добрый день. Имеется следующая проблема: Если русский текст указан напрямую в коде разметки, то с ним все отлично - в коде страницы...

VK API: можно ли при получении сообщения сразу получать об этом уведомление
Возможно ли при получении сообщения сразу получать об этом уведомление или необходимо постоянно отправлять запрос на проверку наличия новых...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru