Записать Byte Array в файл Javascript - PullRequest
0 голосов
/ 02 сентября 2018

Привет, эксперты! У меня есть веб-сервис java rest, который возвращает документы в виде байтового массива, мне нужно написать код javascript, чтобы получить ответ веб-сервиса, и записать его в файл, чтобы загрузить этот файл в формате pdf. Пожалуйста, посмотрите снимок экрана веб-сервиса. ответьте и посмотрите мой пример кода, этот код загружает поврежденный файл PDF `

        var data = new FormData();
        data.append('PARAM1', 'Value1');
        data.append('PARAM2', 'Value2');
        var xhr = new XMLHttpRequest();
        xhr.open('POST', 'SERVICEURL');
        xhr.withCredentials = true;
        xhr.setRequestHeader("Authorization", "Basic " + btoa("username:password"));
        xhr.onload = function() {

            console.log('Response text = ' + xhr.responseText);
            console.log('Returned status = ' + xhr.status);


            var arr = [];
            arr.push(xhr.responseText);

            var byteArray = new Uint8Array(arr);
            var a = window.document.createElement('a');
            a.href = window.URL.createObjectURL(new Blob(byteArray, { type: 'application/octet-stream' }));
            a.download = "tst.pdf";
            // Append anchor to body.
            document.body.appendChild(a)
            a.click();
            // Remove anchor from body
            document.body.removeChild(a)

        };
        xhr.send(data);

`enter image description here

1 Ответ

0 голосов
/ 02 сентября 2018

Поскольку вы запрашиваете двоичный файл, вам нужно сообщить XHR и о taht, в противном случае он будет использовать кодировку по умолчанию «текст» (UTF-8), которая будет интерпретировать pdf как текст и испортит кодировку. Просто назначьте responseType свойство MIME тип pdf

var xhr = new XMLHttpRequest();
xhr.responseType = 'blob'; // tell XHR that the response will be a pdf file

// OR xhr.responseType = 'application/pdf'; if above doesn't work

И вы получите к нему доступ, используя свойство response, а не responseText. Таким образом, вы будете использовать arr.push(xhr.response);, и он вернет вам BLOB-объект.

Если это не сработает, сообщите мне, чтобы обновить другое решение.

Обновление:

var xhr = new XMLHttpRequest();
xhr.responseType = 'blob'; // tell XHR that the response will be a pdf file
xhr.onload = function() {
    var blob = this.response;
    var a = window.document.createElement('a');
    a.href = window.URL.createObjectURL(blob);
    a.download = "tst.pdf";
    document.body.appendChild(a);
    a.click();
    document.body.removeChild(a);
};
...