Компонент Blazor Razor создать ссылку на скачивание PDF - PullRequest
0 голосов
/ 06 апреля 2020

Я уже несколько дней бьюсь над этим и не могу понять. Как создать ссылку для загрузки в компоненте Blazor Razor с локальным URL-адресом файла для файла PDF.

@code {
string noteContent;
string fileName = "note.txt";

string path = @"E:\Attachments\test.txt";
Uri myUri = new Uri(@"E:\Attachments\test.txt");

public async void DownloadFile()
{
    //await JSRuntime.InvokeAsync<object>(
    //    "FileSaveAs",
    //    fileName,
    //    noteContent
    //);

   await JSRuntime.InvokeAsync<object>(
   "downloadURI",
   myUri,
   "test.txt"
      );
    }
 }

и js file

function FileSaveAs(filename, fileContent) {
    var link = document.createElement('a');
    link.download = filename;
    link.href = "data:text/plain;charset=utf-8," + 
    encodeURIComponent(fileContent)
    document.body.appendChild(link);
    link.click();
    document.body.removeChild(link);
}

function downloadURI(uri, name) {
    var link = document.createElement("a");
    link.download = name;
    link.href = uri;enter code here
    document.body.appendChild(link);
    link.click();
    document.body.removeChild(link);
    delete link;
}

1 Ответ

0 голосов
/ 06 апреля 2020

Вот пример 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#, в зависимости от конкретного случая использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...