如何使用jsZip作为驻留在同一服务器上的图像URL

时间:2016-10-28 08:29:28

标签: javascript jszip

这是我的问题,我无法通过谷歌搜索后使用jsZip提取图像。我发现solution只能帮助我在页面加载开始时压缩文件。

这是我的代码

<table class="table table-condensed" id="downloadTable">
            <thead>
                <tr>
                    <th>Select</th>
                    <th>File name</th>
                    <th>Image</th>
                    <th>Option</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>
                        <div class="checkbox">
                            <input type="checkbox"  id="file1" name="file" value="https://bibekshakya35.github.io/img/image-me.jpg" />
                        </div>
                    </td>
                    <td>file1</td>
                    <td><a target="_self" href="https://bibekshakya35.github.io/img/image-me.jpg"  class="btn btn-block" download="file1"/>file1</a></td>
                </tr>                        
                <tr>
                    <td>
                        <div class="checkbox">
                            <input type="checkbox" name="file"  id="file2" value="https://bibekshakya35.github.io/img/portfolio/bullock/2.JPG" />
                        </div>
                    </td>
                    <td>file2</td>
                    <td><a target="_self" href="https://bibekshakya35.github.io/img/portfolio/bullock/2.JPG"  class="btn btn-block" download="file2"/>file2</a></td>
                </tr>
                <tr>
                    <td>
                        <div class="checkbox">
                            <input type="checkbox" name="file" id="file3" value="https://bibekshakya35.github.io/img/portfolio/bullock/3.JPG" />
                        </div>
                    </td>
                    <td>file3</td>
                    <td><a target="_self" href="https://bibekshakya35.github.io/img/portfolio/bullock/3.JPG"  class="btn btn-block" download="file3"/>file3</a></td>
                </tr>
                <tr>
                    <td>
                        <div class="checkbox">
                            <input type="checkbox" name="file" id="file4" value="https://bibekshakya35.github.io/img/portfolio/bullock/4.JPG" />
                        </div>
                    </td>
                    <td>file4</td>
                    <td><a target="_self" href="https://bibekshakya35.github.io/img/portfolio/bullock/4.JPG"  class="btn btn-block" download="file4"/>file4</a></td>
                </tr>


            </tbody>
        </table>
 <input type="button" id="lnk" onclick="alert(getCheckedCheckboxesFor('file'));" value="Get Values" />

这里是js代码

<script type="text/javascript">
            var images = [];
            var counter = 0;
            var values = [];
            function getCheckedCheckboxesFor(checkboxName) {

                var checkboxes = document.querySelectorAll('input[name="' + checkboxName + '"]:checked'), values = [];
                Array.prototype.forEach.call(checkboxes, function (el) {
                    values.push(el.value);
                });
                for (var i = 0; i < values.length; i++) {
                    convertImgToBase64URL(values[i], function (base64Img, url) {
                        images.push({
                            url: url,
                            data: base64Img
                        });
                        counter++;
                        if (counter === values.length) {
                            createArchive(images);
                        }
                    });
                }

                return values;




            }

            function convertImgToBase64URL(url, callback, outputFormat) {
                var img = new Image();
                img.crossOrigin = 'Anonymous';
                img.onload = function () {
                    var canvas = document.createElement('CANVAS'),
                            ctx = canvas.getContext('2d'), dataURL;
                    canvas.height = this.height;
                    canvas.width = this.width;
                    ctx.drawImage(this, 0, 0);
                    dataURL = canvas.toDataURL(outputFormat);
                    callback(dataURL, url);
                    canvas = null;
                };
                img.src = url;
            }

            function createArchive(images) {
                // Use jszip
                var zip = new JSZip();
                var img = zip.folder("images");
                for (var i = 0; i < images.length; i++) {
                    img.file(images[i].url, images[i].data, {base64: true});
                }
                var content = zip.generate({type: "blob"});

                // Use FileSaver.js
                saveAs(content, "images.zip");
            }

        </script>

经过几次调试后,我发现var content = zip.generate({type: "blob"});说内容类型未定义。任何人都知道什么是问题?

1 个答案:

答案 0 :(得分:0)

您的values变量在getCheckedCheckboxesFor中被隐藏,load过早被调用:

var values; // (1) global variable, equals to undefined
function getCheckedCheckboxesFor(checkboxName) {
  var values = []; // (2) shadowing the first one
  // ...
  values.push(el.value); // updates (2)
  return values; // returns the correct array... which is not used
}

// ...

(function load() {
  // values here is (1), equals to undefined. values.length triggers an Error !
  if (index < values.length) {
    // ...
  }
})(); // you call the function too early, you should wait for the user to click

要解决此问题,您可以移除全局values变量并在点击回调中移动load

<input onclick="triggerDownload('file')" />

function triggerDownload(checkboxName) {
  var values = getCheckedCheckboxesFor(checkboxName);

  (function load() {
    // ...
  })();
}

您还可以从与您的用例类似的文档中查看this example(以及source code)。