Prečo FileSaver saveAs nebude fungovať s JSZip?

0

Otázka

Prvé vysielanie, to je celý kód (väčšinou to som našiel na internete a vylepšil niektoré veci slúžiť môj účel), ale presnejšie povedané, moja chyba je na konci, kde som si.

Uncaught TypeError: Failed to execute 'createObjectURL' na 'URL': Preťaženie rozlíšenie nepodarilo.

Keď som jednoducho použiť saveAs(img_url, "img.png"), možnosť uložiť na notebook pops up. Ale ja si chybu som už spomenul vyššie, keď sa snaží používať "obsah". Mám filesaver a jszip v skripte, ja len nedokážem nájsť nejaký spôsob, ako opraviť chyby, ktoré sa potom zastaví vykonávanie nič viac. Ospravedlňujeme sa za chaotický kód, by veľmi radi pomôžu.

Hlavná časť je k dolnej časti, zvyšok je tam len zapouzdřit niekto chcieť vidieť. Theres url blob potom plátno generátor, ja len neviem prečo sa to nebude uložiť.

!function() {
    function dataURLtoBlob(dataURL, type) {
      var binary = atob(dataURL.split(',')[1]),
          length = binary.length,
          binaryArray = new Uint8Array(length);
      for (var i = 0; i < length; i++) {
        binaryArray[i] = binary.charCodeAt(i);
      }
      return new Blob([binaryArray], {type: type});
    }

    var SolidImage = function() {
      var canvas = document.createElement('canvas'),
          ctx = canvas.getContext('2d');
      this.img = new Image();
      this.make = function(color) {
        canvas.width = 500;
        canvas.height = 500;
        
        ctx.fillStyle = color;
        ctx.fillRect(0, 0, canvas.width, canvas.height);
        ctx.fillStyle = "#FFFFFF";
        ctx.textAlign = "center";
        ctx.font = "bold 50px Courier New";
        ctx.fillText(color.substring(3), 250, 250);
        var dataURL = canvas.toDataURL('image/png')
        this.img.src = dataURL;
        if (this.blobURL) URL.revokeObjectURL(this.blobURL);
        this.blob = dataURLtoBlob(dataURL, 'image/png');
        this.blobURL = URL.createObjectURL(this.blob);
      }
    };
    
    var solidImage = new SolidImage(),
        button = document.getElementById('make'),
        result = document.getElementById('result'),
        link = document.createElement('a');
    
    link.setAttribute('target', '_blank');
    result.appendChild(solidImage.img);
    result.insertAdjacentHTML('beforeend', 'Save this image or<br>');
    result.appendChild(link);
    solidImage.img.width = 600;
  
    
    button.addEventListener('click', function(){
        var zip = new JSZip();
        console.log("after zip");
        //var img = zip.folder("rdm_imgs");
        //////////////////////////////////
        for (var i = 0; i < 1; i++) {
            setTimeout(function() {
        var rgb_r = Math.floor(Math.random() * (256+1)),
            rgb_g = Math.floor(Math.random() * (256+1)),
            rgb_b = Math.floor(Math.random() * (256+1)),
            random_color = "rgb(" + rgb_r + ", " + rgb_b + ", " + rgb_g + ")";
      var filename = random_color.replace(/\s/g, "") + '.png';
      solidImage.make(random_color);
      link.innerHTML = 'Download content ' + filename;
      var img_url = solidImage.blob;
      //console.log(img_url.replace(/^data:image\/(png|jpg);base64,/, ""));
      console.log(img_url);
      //link.setAttribute('href', img_url);
      //link.setAttribute('download', filename);
      result.className = 'generated';

      zip.file(filename, img_url);
            },i * 500)}
        console.log("after loop");
        var content = zip.generateAsync({type:"blob"});
        console.log("after zip generate");
        saveAs(content, "imgs.zip");
        console.log("after saveAs");
        //link.innerHTML = 'Download Contents.zip';
        //var img_url = solidImage.blobURL;
        //link.setAttribute('href', content);
        //link.setAttribute('download', "content.zip");
    });
  }();
blob filesaver.js javascript jszip
2021-11-21 21:48:48
1

Najlepšiu odpoveď

1

zip.gzip.generateAsync() vráti Sľub. Tento Sľub bude riešiť s Blob, niekedy neskôr, ale je to Sľub, nie Blob.
Takže musíte počkať na rozlíšenie tento Sľub prístup generované Blob.

Môžete označiť svoju funkciu ako async a potom použiť await kľúčové slová:

button.addEventListener('click', async function(){
  // ...
  var content = await zip.generateAsync({type:"blob"});

Alebo zabaliť saveAs časť v spätné volanie odovzdané Sľub je .then():

zip.generateAsync({type:"blob"}).then(function(content) {
  console.log("after zip generate");
  saveAs(content, "imgs.zip");
})

Teraz, čo si vyberiete, vaše zip súbor, ktorý bude skutočne prázdny. Môžete pridávať obsah na to len na žiadosť o spätný hovor z setTimeout,, čo znamená, že tento obsah bude pridaný iba potom, čo ste si vytvoriť zip súbor, ktorý je príliš neskoro.
Takže odstrániť setTimeout( časť, ktorá sa zdá byť zbytočné a vykonať svoju žiadosť o spätný hovor obsah priamo.

2021-11-21 23:32:28

Mal som použil setTimeout pridať oneskorenie pri vizuálne vidieť to chcete zmeniť, a to prostredníctvom náhodných farieb na HTML stránke. Budem sa snažiť, ktoré, hoci, ako prísť zip by byť prázdny? Ale ja by som sa predpokladať, že keďže som inicializovať zip akonáhle tlačidlo klikli, potom do slučky som pridávaní súborov do zip zložky?
absolutenoob

Wow, to fungovalo, ďakujem vám veľmi pekne. Ak by ste mohli, mohol by si možno vysvetliť, prečo konkrétne, že bol problém?
absolutenoob

Problém spôsobuje "Uncaught TypeError: Failed to execute 'createObjectURL' na 'URL': Preťaženie rozlíšenie nepodarilo." bolo, že ste zložili Sľub, objekt namiesto Blob. Pre prázdne zip je to preto, setTimeout(fn) bude meškanie fn o nejaký čas neskôr (aj v prípade, ak je timeout 0). Takže keď to callback fn je nazývaný, riadkov nižšie sa už boli vykonané. A keďže v riadkoch pod sebou robiť dopracovať zip súbor, tento zip súbor je vytvorený pred pridaním akéhokoľvek súboru na to, som.e je prázdne.
Kaiido

oh, tak setTimeout(fn) tlačí fn na vykonanie naposledy? Zaujímavé, ako sa potom by som urobiť pre slučka, ktorá má oneskorenie každej iterácii, ale tiež nie odložiť volania na konci?
absolutenoob

Použitie Sľubuje, môžete sa pozrieť na stackoverflow.com/questions/14220321/...
Kaiido

V iných jazykoch

Táto stránka je v iných jazykoch

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................