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

Posted

技术标签:

【中文标题】通过浏览器中的 Javascript 在 iOS 上保存 Zip 文件【英文标题】:Saving Zip Files On iOS via Javascript In The Browser 【发布时间】:2018-11-26 21:50:30 【问题描述】:

几年前,我创建了一个应用程序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) 封装问题 1 根本不是一个选项(至少在 Apple 改进他们的技术之前。有没有人知道一种将 zip 文件动态保存到服务器的方法,类似于 JSZip 通过 blob 保存 zip 文件的方式?

【问题讨论】:

【参考方案1】:

实际问题不在 JSZip 中,而是在 FileSaver.js 中,如 example 所示。

在 FileSaver README 中有一个适用于 ios 的 warning。

saveAs 必须在用户交互事件中运行,例如 onTouchDownonClicksetTimeout 将阻止 saveAs 触发。由于 iOS saveAs 中的限制在 新窗口 中打开,而不是 下载,如果你想修复这个问题,请告诉苹果这个错误是怎么回事 影响你。

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

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

怎么做?我修改了 JSZip 官网的例子。作为 HTTP 客户端,我更喜欢 axios,但你可以使用 vanilla 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);
            );
);
    已打开一些错误,并建议从 2012 年 [原文如此!] 和 Bug 167341 开始提供补丁 Bug 102914。我相信社区可以推动这个修复发生。

【讨论】:

您知道一种将 zip 文件动态保存到服务器的方法,类似于 JSZip 通过 blob 保存 zip 文件的方式吗? 我更新了我的答案。我希望我为您提供了一个详尽的问题答案,这对您的应用程序有帮助。 是的,它确实有帮助

以上是关于通过浏览器中的 Javascript 在 iOS 上保存 Zip 文件的主要内容,如果未能解决你的问题,请参考以下文章

IOS:Safari不兼容Javascript中的Date问题

IOS5中的Safari不兼容Javascript中的Date问题

移动 safari (iOS) 中的 javascript 不会下载日历邀请

vue的爬坑之路之----IOS:Safari不兼容Javascript中的Date问题

js判断是安卓还是ios 微信

iOS UIWebView 中的 Javascript console.log()