web-dev-qa-db-fra.com

Comment sauvegarder des données binaires d'un fichier Zip en Javascript?

Je reçois une réponse en dessous de AJAX réponse:

ceci est la réponse du fichier Zip . s'il vous plaît laissez-moi savoir comment enregistrer ce nom de fichier.Zip en Javascript. Le fichier PDF se trouve dans le fichier Zip.

Mon code est comme ça: 

$.ajax({

    url: baseURLDownload + "/service/report-builder/generateReportContentPDF",
    beforeSend: function (xhr) {
        xhr.setRequestHeader("Access-Control-Allow-Origin", "*");
        xhr.responseType = 'arraybuffer'
    },
    type: "POST",
    data: JSON.stringify(parameter),
    contentType: "application/json",
    success: function(result) {
        console.log("ssss->"+result);
        var base64String = utf8_to_b64(result);
        //window.open("data:application/Zip;base64,"+base64String); // It will download pdf in Zip
        var Zip = new JSZip();
        Zip.add("PDFReport.pdf", result);
        content = Zip.generate();
        location.href="data:application/Zip;base64," + content;
        $.mobile.loading('hide');

    },
    error: function(xhr){
        console.log("Request Status: " + xhr.status + " Status Text: " + xhr.statusText + " " + xhr.responseText);
        $.mobile.loading('hide');
        showAlert("Error occured. Unable to download Report", "Message", "OK");

    }
});

RESPOSE Console.log ("ssss ->" + résultat);

PK Q F /crt_pdf_10204725.pdf uX\M 8 | p ; w @ p ܝ Bp ; | C ھ w = O ]]% N # + reup Y ̉ J 3) O C F M P & rA @ 7T. z (% h x x0 0Z -i % q e M i "c -/ j /L 瞄 0 > o [ ��6 멆�n��s�$� �#>˘ '��wT�� ���3�36DK�+�̓�t6 ��r��sA:���x�<>n������'U��RLqA+���ݺ�BM��:4ĞP�}���:�}ߣP����?F)�9-�W0���2�{x��#2v8N.$V�>X=/�+�c}���ּ�\y���\*�J\�� ���90�T�L� 3p���*Sfj(���PWWz��O�s�9]&� iO | 9 ; 5 ʘdW cl% %; u % [ 5 Q] $ [L> yXg 9 2 + &, iFs Q u ???? . E (> W + M؟ Ei | ���k�k�c蟴CcG�j��4s|x �F1 } Y , 29 0M = -O m\L y ^ le ^ \ u a F9: zc Sy - g fu n C T: { 4 &/ LM9 98 & Pnc ! m r ~ ) 74 04 0 0 M ~ " .ikjG M -

14
Nishant Singh

Enfin, j'ai eu la réponse à ma question:

Voici le code:

var xhr = new XMLHttpRequest();
xhr.open("POST", baseURLDownload + "/service/report/QCPReport", true);
xhr.setRequestHeader("Content-type","application/json");
xhr.setRequestHeader("Access-Control-Allow-Origin", "*");
xhr.onreadystatechange = function() {
    if (xhr.readyState == 4 && xhr.status == 200) {
        // alert("Failed to download:" + xhr.status + "---" + xhr.statusText);
        var blob = new Blob([xhr.response], {type: "octet/stream"});
        var fileName = "QCPReport.Zip";
        saveAs(blob, fileName);
    }
}
xhr.responseType = "arraybuffer";
xhr.send(JSON.stringify(QCPParameter));
18
Nishant Singh

Pas de dépendance.

Compatible avec IE 10,11, Chrome, FF et Safari:

function str2bytes (str) {
   var bytes = new Uint8Array(str.length);
   for (var i=0; i<str.length; i++) {
      bytes[i] = str.charCodeAt(i);
    }
    return bytes;
}

var xhr = new XMLHttpRequest();
xhr.open("POST", baseURLDownload + "/service/report/QCPReport", true);
xhr.setRequestHeader("Content-type","application/json");
xhr.setRequestHeader("Access-Control-Allow-Origin", "*");
xhr.onreadystatechange = function() {
    if (xhr.readyState == 4 && xhr.status == 200) {
        // alert("Failed to download:" + xhr.status + "---" + xhr.statusText);
        var blob = new Blob([str2bytes(xhr.response)], {type: "application/Zip"});
        var fileName = "QCPReport.Zip";
        if (navigator.msSaveOrOpenBlob) {
            navigator.msSaveOrOpenBlob(blob, filename);
        } else {
            var a = document.createElement("a");
            document.body.appendChild(a);
            a.style = "display:none";
            var url = window.URL.createObjectURL(blob);
            a.href = url;
            a.download = filename;
            a.click();
            window.URL.revokeObjectURL(url);
            a.remove();
        }
    }
}
xhr.responseType = "arraybuffer";
xhr.send(JSON.stringify(QCPParameter));
3
Below the Radar

Pour ceux d'entre vous qui utilisent fetch, vous pouvez le faire en faisant quelque chose comme ceci.

fetch(url, config).
  .then((response) => {
    return response.arrayBuffer()
  })
  .then((data) => handleData(data))

Dans handleData, vous allez ensuite instancier l'objet Blob pour gérer les données Zip. 

0
IonicBurger

Il existe des bibliothèques (Zip.js me vient à l’esprit) pour gérer ce genre de choses, en supposant que vous souhaitiez obtenir ce que contient le fichier Zip. Si vous souhaitez simplement enregistrer le fichier Zip, vous le traiterez comme tout autre fichier.

0
Scott Hunter