Вот пример JS Функция взаимодействия, которая дает конечному пользователю запрос на загрузку:
window.saveFile = function (bytesBase64, mimeType, fileName) {
var fileUrl = "data:" + mimeType + ";base64," + bytesBase64;
fetch(fileUrl)
.then(response => response.blob())
.then(blob => {
var link = window.document.createElement("a");
link.href = window.URL.createObjectURL(blob, { type: mimeType });
link.download = fileName;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
});
}
Вот как я вызываю его из приложения Blazor:
public static void Save(IJSRuntime jsRuntime, byte[] byteData, string mimeType, string fileName)
{
if (byteData == null)
{
jsRuntime.InvokeVoidAsync("alert", "The byte array provided for Exporting was Null.");
}
else
{
jsRuntime.InvokeVoidAsync("saveFile", Convert.ToBase64String(byteData), mimeType, fileName);
}
}
Что осталось это получить ваш byte[]
из файла. То, как вы это сделаете, будет зависеть от вашего варианта использования и приложения, вот несколько общих случаев:
в серверном приложении Blazor, ваш C# уже работает на сервере Таким образом, вы можете ввести IWebHostEnvironment
и получить из него веб-путь root для доступа к вашему файлу - что-то вроде var path = _hostingEnvironment.WebRootPath + \\myfile.txt
, а затем просто прочитать по этому пути. Затем вызовите JS Interop
в приложении WASM, у вас нет файловой системы. Таким образом, вам необходимо хранить эти данные в памяти - независимо от того, получили ли вы их из средства выбора файлов или из какой-либо конечной точки WebAPI, или даже сгенерировали их в C#, в зависимости от конкретного случая использования.