Приложение Blazor WASM открывает поток памяти PDF в другой вкладке браузераC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Приложение Blazor WASM открывает поток памяти PDF в другой вкладке браузера

Сообщение Anonymous »

Я считаю, что этот код может быть способом открыть PDF-файл в кодировке Base64 в другой вкладке или окне браузера. Однако, когда я пытаюсь на своем ПК с Windows использовать браузер Edge, появляется новая пустая вкладка, и процессор ПК начинает работать дальше, пока я не закрою браузер. PDF-документ не отображается.
using (var memoryStream = new MemoryStream())
{
pdf.Save(memoryStream);
string base64 = Convert.ToBase64String(memoryStream.ToArray());
string url = $"data:application/pdf;base64,{base64}";
JS.InvokeVoidAsync("open", url, "_blank");
}

Я также попробовал аналогичный метод для загрузки файла вместо открытия. Опять же, браузер не указывал на то, что происходит загрузка файла, и процессор ПК продолжал работать, пока я не закрыл браузер.
using (var memoryStream = new MemoryStream())
{
pdf.Save(memoryStream);

JS.InvokeAsync(
"downloadFile",
uid + ".pdf",
Convert.ToBase64String(memoryStream.ToArray())
);
};

Используется этот скрипт downloadFile.

function downloadFile(fileName, bytesBase64) {
if (navigator.msSaveBlob) {
var data = window.atob(bytesBase64);
var bytes = new Uint8Array(data.length);
for (var i = 0; i < data.length; i++) {
bytes = data.charCodeAt(i);
}
var blob = new Blob([bytes.buffer], { type: "application/octet-stream" });
navigator.msSaveBlob(blob, fileName);
}
else {
var link = document.createElement('a');
link.download = fileName;
link.href = "data:application/octet-stream;base64," + bytesBase64;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}
}



function open(bytesBase64) {
var blob = base64ToBlob(bytesBase64, "application/octet-stream");
var url = URL.createObjectURL(blob);
window.open(url, "_blank");
}

function base64ToBlob(base64, contentType) {
var byteCharacters = atob(base64);
var byteArrays = [];

for (var offset = 0; offset < byteCharacters.length; offset += 512) {
var slice = byteCharacters.slice(offset, offset + 512);

var byteNumbers = new Array(slice.length);
for (var i = 0; i < slice.length; i++) {
byteNumbers = slice.charCodeAt(i);
}

var byteArray = new Uint8Array(byteNumbers);
byteArrays.push(byteArray);
}

var blob = new Blob(byteArrays, { type: contentType });
return blob;
}



Подробнее здесь: https://stackoverflow.com/questions/788 ... rowser-tab
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»