在浏览器中通过Javascript在iOS上保存Zip文件

时间:2018-06-18 04:55:45

标签: javascript ios download zip jszip

几年前,我创建了一个应用kodeWeave。现在kodeWeave使用名为JSZip的javascript库,用于在客户端创建和下载.zip文件。

但是,我无法在iPhone上使用JSZip下载zip文件,但如果zip文件位于Github等服务器上,我实际上可以在iPhone上下载zip文件。

我起初认为它可能只是Chrome浏览器,但是,我测试了其他浏览器,如Safari,Firefox,Edge,Dolphin Browser和MyMedia。所有人都会打开一个新的blob或空白标签,但就是这样,它只是位于一个什么都不做的空白标签上。

因为我可以在服务器上下载zip文件,所以这个问题与JSZip的编程方式有关。所以我的问题分为两部分。

1)有没有人知道如何用JSZip解决这个问题?

2)Encase问题1根本不是一个选项(至少在Apple改进他们的技术之前。有没有人知道一种将zip文件动态保存到服务器的方法,类似于JSZip如何通过blob保存zip文件?

1 个答案:

答案 0 :(得分:1)

实际问题不在JSZip中,而在FileSaver.js中显示的example中。

在FileSaver自述文件中,有一个warning用于iOS。

  

saveA必须在用户互动事件(例如 onTouchDown )中运行   或 onClick setTimeout 将阻止saveAs触发。由于   iOS saveAs中的限制会在新窗口中打开,而不是   下载,如果您要修复此问题,请告诉苹果此错误的原因   影响你。

还请注意其他浏览器支持及其对您的应用程序的限制。

  1. 这不是JSZip的问题。由于系统限制,无法在iOS中修复FileSaver。 我建议您将临时zip文件上传到后端,并提供下载链接给最终用户。

该怎么做??我修改了JSZip官方网站上的示例。作为HTTP客户端,我更喜欢 axios ,但是您可以使用普通的XMLHttpRequest或fetch。

var zip = new JSZip();
zip.file("Hello.txt", "Hello World\n");
var img = zip.folder("images");
img.file("smile.gif", imgData, {base64: true});

zip.generateAsync({type:"blob"})
    .then(function(content) {
        const file = new FormData();
        file.append("blob", content)

        axios.put('/upload/server', file, {})
            .then(function (res) {
              // done
              console.info('Uploaded')
            })
            .catch(function (err) {
              console.error('Failed due', err.message);
            });
});
  1. 从2012年[sic!]和Bug 102914开始,我们打开了许多错误,并提出了Bug 167341补丁。我相信社区可以推动这种修复的实现。