Blazor WASM создать и скачать файл

У меня есть класс, который можно сериализовать в файл json. Я хочу разрешить пользователям загружать файл json.

Как я могу сгенерировать файл в памяти, а затем загрузить его браузером ??

Я думаю, мне нужен какой-то поток, но как мне сделать так, чтобы он загружался потом? Я бы хотел избежать JS, так как я ничего о нем не знаю

Итак, в newtonsoft JsonConvert.SerializeObject() возвращает строку, поэтому получить ее в текстовом файле очень просто. Что касается разрешения на загрузку файла, здесь должна быть применима эта статья для ASP.NET. Не уверен, каким должен быть точный Content-Type, учитывая, что это текстовый файл JSON, я предполагаю, что предпочитаю типизацию, используемую для .txt.

Narish 10.01.2023 16:37

Я размещаю это на страницах github, смогу ли я создать там текстовый файл из кода? Не говорю, что думаю, что это невозможно, просто пытаюсь предвидеть трудности. Итак, если я правильно вас понял, я создаю файл, заполняю его строковым содержимым, а затем создаю загрузку для этого файла?

javirs 10.01.2023 17:02

Я не думаю, что это лучшая практика, но я бы хотел включить временный каталог в свой проект и, по сути, записать и временно сохранить файл во временный каталог, а затем сразу же удалить его. Теперь, если бы вы были на реальном сервере и точно знали, что эти файлы станут слишком большими, то вы определенно не захотели бы этого делать. Но файлы JSON крошечные, и, насколько я знаю, страницы github не убьют вас, если вы используете часть их пространства.

Narish 10.01.2023 17:21

Если бы вы могли добавить несколько примеров, я бы предпочел это решение JS. Но я действительно понятия не имею, куда добавить весь этот код, который вы уподобили в статье…

javirs 11.01.2023 10:13

Я сам едва работал с Blazor, и на самом деле я не пытался сделать это сам даже в ASP.NET, что помешало мне опубликовать свой собственный ответ. Чтобы начать очень просто, я бы сказал, поместите эту логику в метод внутри блока @code{}, который привязывается как событие к предполагаемой кнопке загрузки. Попробуйте и заставьте его работать таким образом. Оттуда вы можете рассмотреть возможность перемещения его в свою внутреннюю структуру MVC/MVVM, если вы даже используете это для Blazor.

Narish 11.01.2023 16:09
Laravel с Turbo JS
Laravel с Turbo JS
Turbo - это библиотека JavaScript для упрощения создания быстрых и высокоинтерактивных веб-приложений. Она работает с помощью техники под названием...
Типы ввода HTML: Лучшие практики и советы
Типы ввода HTML: Лучшие практики и советы
HTML, или HyperText Markup Language , является стандартным языком разметки, используемым для создания веб-страниц. Типы ввода HTML - это различные...
Аутсорсинг разработки PHP для индивидуальных веб-решений
Аутсорсинг разработки PHP для индивидуальных веб-решений
Услуги PHP-разработки могут быть экономически эффективным решением для компаний, которые ищут высококачественные услуги веб-разработки по доступным...
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
Слишком много useState? Давайте useReducer!
Слишком много useState? Давайте useReducer!
Современный фронтенд похож на старую добрую веб-разработку, но с одной загвоздкой: страница в браузере так же сложна, как и бэкенд.
Узнайте, как использовать теги <ul> и <li> для создания неупорядоченных списков в HTML
Узнайте, как использовать теги <ul> и <li> для создания неупорядоченных списков в HTML
HTML предоставляет множество тегов для структурирования и организации содержимого веб-страницы. Одним из наиболее часто используемых тегов для...
0
5
75
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот как я это сделал в своем проекте с JS Interop и System.Text.Json. Этот код не использовался мной уже пару месяцев, и я не могу его протестировать прямо сейчас. Но это сработало, когда я добавил его.

Код блейзера:

@using System.Text.Json
@using Microsoft.JSInterop
@inject IJSRuntime JSRuntime

...

async Task downloadObject(object objectToSave, string fileName)
{
    var obj = JsonSerializer.Serialize(objectToSave);
    var fileStream = new MemoryStream(new UTF8Encoding(true).GetBytes(obj));
    using var streamRef = new DotNetStreamReference(stream: fileStream);
    await JSRuntime.InvokeVoidAsync("downloadFileFromStream", fileName, streamRef);
}

JavaScript:

window.downloadFileFromStream = async (fileName, contentStreamReference) => {
    const arrayBuffer = await contentStreamReference.arrayBuffer();
    const blob = new Blob([arrayBuffer]);
    const url = URL.createObjectURL(blob);
    const anchorElement = document.createElement('a');
    anchorElement.href = url;

    if (fileName) {
        anchorElement.download = fileName;
    }

    anchorElement.click();
    anchorElement.remove();
    URL.revokeObjectURL(url);
}

Я хотел избежать JS, но… В итоге сделал это. Работает как шарм.

javirs 11.01.2023 12:12

Другие вопросы по теме