我有一个类,可以序列化成json文件,我想让用户下载json文件。
我如何在内存中生成一个文件,然后让浏览器下载它??
我想我需要有某种形式的流,但我如何使它下载之后?我想避免使用JS,因为我对它一无所知
这是我在我的项目中使用JS Interop和System.Text.Json的方法。这段代码已经几个月没有被我使用了,但我现在无法测试它。但当我添加它时,它确实工作了。
Blazor代码:
@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);
}