用于在字节数组中显示PDF文件的JavaScript代码(不是base64编码)

时间:2022-10-24 14:11:07

I am working with an ASP .NET Web API where the POST function of the API is returning a byte array like so in the C# code:

我正在使用ASP .NET Web API,其中API的POST函数在C#代码中返回一个像这样的字节数组:

return Ok(outputStream.ToArray());

Where outputStream is of type System.IO.MemoryStream and the ToArray() is returning a byte array.

其中outputStream的类型为System.IO.MemoryStream,ToArray()返回一个字节数组。

This function is returning a PDF stream that I want to display to the users in their browser or at least let them save it.

此函数返回我想要在其浏览器中向用户显示的PDF流,或者至少让他们保存它。

I've ran across a JavaScript example from Stack Overflow that shows how to get a Blob from a Base64 encoded string and display it and I was able to get it working when the API returned a Base64 encoded string; however, I wasn't able to get it working when the API was return the byte array as shown before.

我在Stack Overflow中遇到了一个JavaScript示例,该示例演示了如何从Base64编码的字符串中获取Blob并显示它,并且当API返回Base64编码的字符串时,我能够使其工作。但是,当API返回如前所示的字节数组时,我无法使其正常工作。

May I get some code examples of how to get it working when the API is returning a byte array?

我可以获得一些代码示例,说明当API返回字节数组时如何使其工作?

1 个解决方案

#1


0  

My JQuery Ajax POST request looks like:

我的JQuery Ajax POST请求如下所示:

function LoadPDF() {
        var args = [];
        var x = $.ajax({
            type: "POST",
            url: "DirectoryQuery.aspx/GetFullPdf",
            contentType: "application/json; charset=UTF-8",
            responseType: "text/plain; charset=UTF-8",
            async: true,
            dataType: "json",                             
            processData: "false",
            success: OnSuccess,
            error: OnErrorCall
        }); 
        function OnSuccess(response) {
            var byteArray = new Uint8Array(response.d);

            saveTextAsFile("document.pdf", byteArray);
        }
        function OnErrorCall(response) {
            console.log(response);                
            //location.reload();
        }
    }

Try file-save-as.js, like this:

尝试file-save-as.js,如下所示:

function saveTextAsFile(fileNameToSaveAs, textToWrite) {
    /* Saves a text string as a blob file*/
    var ie = navigator.userAgent.match(/MSIE\s([\d.]+)/),
      ie11 = navigator.userAgent.match(/Trident\/7.0/) && navigator.userAgent.match(/rv:11/),
      ieEDGE = navigator.userAgent.match(/Edge/g),
      ieVer = (ie ? ie[1] : (ie11 ? 11 : (ieEDGE ? 12 : -1)));

    if (ie && ieVer < 10) {
        console.log("No blobs on IE ver<10");
        return;
    }

    var textFileAsBlob = new Blob([textToWrite], {
        type: 'text/plain'
    });

    if (ieVer > -1) {
        window.navigator.msSaveBlob(textFileAsBlob, fileNameToSaveAs);

    } else {
        var downloadLink = document.createElement("a");
        downloadLink.download = fileNameToSaveAs;
        downloadLink.href = window.URL.createObjectURL(textFileAsBlob);
        downloadLink.onclick = function (e) { document.body.removeChild(e.target); };
        downloadLink.style.display = "none";
        document.body.appendChild(downloadLink);
        downloadLink.click();
    }
}

#1


0  

My JQuery Ajax POST request looks like:

我的JQuery Ajax POST请求如下所示:

function LoadPDF() {
        var args = [];
        var x = $.ajax({
            type: "POST",
            url: "DirectoryQuery.aspx/GetFullPdf",
            contentType: "application/json; charset=UTF-8",
            responseType: "text/plain; charset=UTF-8",
            async: true,
            dataType: "json",                             
            processData: "false",
            success: OnSuccess,
            error: OnErrorCall
        }); 
        function OnSuccess(response) {
            var byteArray = new Uint8Array(response.d);

            saveTextAsFile("document.pdf", byteArray);
        }
        function OnErrorCall(response) {
            console.log(response);                
            //location.reload();
        }
    }

Try file-save-as.js, like this:

尝试file-save-as.js,如下所示:

function saveTextAsFile(fileNameToSaveAs, textToWrite) {
    /* Saves a text string as a blob file*/
    var ie = navigator.userAgent.match(/MSIE\s([\d.]+)/),
      ie11 = navigator.userAgent.match(/Trident\/7.0/) && navigator.userAgent.match(/rv:11/),
      ieEDGE = navigator.userAgent.match(/Edge/g),
      ieVer = (ie ? ie[1] : (ie11 ? 11 : (ieEDGE ? 12 : -1)));

    if (ie && ieVer < 10) {
        console.log("No blobs on IE ver<10");
        return;
    }

    var textFileAsBlob = new Blob([textToWrite], {
        type: 'text/plain'
    });

    if (ieVer > -1) {
        window.navigator.msSaveBlob(textFileAsBlob, fileNameToSaveAs);

    } else {
        var downloadLink = document.createElement("a");
        downloadLink.download = fileNameToSaveAs;
        downloadLink.href = window.URL.createObjectURL(textFileAsBlob);
        downloadLink.onclick = function (e) { document.body.removeChild(e.target); };
        downloadLink.style.display = "none";
        document.body.appendChild(downloadLink);
        downloadLink.click();
    }
}