几年前,我创建了一个应用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文件?
答案 0 :(得分:1)
实际问题不在JSZip中,而在FileSaver.js中显示的example中。
在FileSaver自述文件中,有一个warning用于iOS。
saveA必须在用户互动事件(例如 onTouchDown )中运行 或 onClick ; setTimeout 将阻止saveAs触发。由于 iOS saveAs中的限制会在新窗口中打开,而不是 下载,如果您要修复此问题,请告诉苹果此错误的原因 影响你。
还请注意其他浏览器支持及其对您的应用程序的限制。
该怎么做??我修改了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);
});
});