使用JSZip生成testing.zip后解压路径不符合预期的问题求助
解决JSZip生成压缩包路径结构错误的问题
我明白你遇到的困扰了——用JSZip打包图片后,解压出来的路径带着URL转义后的冗余结构,而不是你期望的简洁testing/image.jpg。这是因为你直接把完整URL当作了文件路径,我们只需要从URL中提取实际文件名,再手动指定压缩包内的路径就能解决!
核心问题原因
你当前的代码里,应该是直接将完整的URL作为压缩包内的文件路径,JSZip会自动转义URL里的特殊字符(比如:、/),导致生成了冗余的嵌套路径。
解决方案步骤
- 从URL中提取文件名:通过字符串分割方法,获取URL最后一段的文件名(比如
image.jpg) - 指定压缩包内的目标路径:将提取到的文件名放在你想要的文件夹下(比如
nombre/image.jpg)
修改后的完整代码
var urls = ['https://s3-us-west-2.amazonaws.com/files/image.jpg']; var nombre = $scope.meetingName; // 调用函数 compressed_img(urls, nombre); function compressed_img(urls, nombre) { var zip = new JSZip(); var count = 0; var name = nombre + ".zip"; urls.forEach(function (url) { JSZipUtils.getBinaryContent(url, function(err, data) { if(err) { throw err; // 处理请求错误 } // 从URL中提取文件名:分割URL取最后一段 const fileName = url.split('/').pop(); // 指定压缩包内的路径:文件夹名/文件名 zip.file(`${nombre}/${fileName}`, data, {binary: true}); count++; // 所有文件处理完成后生成压缩包 if(count === urls.length) { zip.generateAsync({type:'blob'}).then(function(content) { // 这里可以添加下载逻辑,比如用saveAs保存 // saveAs(content, name); }); } }); }); }
关键代码解释
url.split('/').pop():把URL按/分割成数组,取最后一个元素就是文件名,这个方法能兼容不同结构的URL。zip.file(${nombre}/${fileName}, data, {binary: true}):明确指定压缩包内的路径为你的文件夹名/文件名,{binary: true}确保二进制文件(比如图片)被正确处理。
这样修改后,生成的testing.zip解压后就会得到testing/image.jpg的结构啦!
内容的提问来源于stack exchange,提问作者Gokulakrishnan M




