Node.js读取ZIP文件的同步方法

3
我正在尝试读取一个ZIP文件并将其输出到浏览器,获取页面上显示的代码并将其保存为ZIP文件。
fs.readFileSync('/dir/file.zip','utf-8')

当我这样做时,输出的内容以PK�coG���^�*filename.txt开头并继续一段时间。但是,当我将结果保存为file.zip文件时,无法提取文件。它说文件已损坏或不是有效的ZIP文件。
如果我在Notepad++中打开一个非常相似的文件,开头和结尾非常相似。我错过了一些明显的东西吗?
有什么想法可以使用fs.readFileSync函数获取ZIP文件的内容,保存它以便我可以提取它?

你使用纯 Node HTTP 模块,还是使用像 Express 这样的库? - jakub.g
3个回答

0

ZIP是一种二进制文件类型,当您在浏览器中将其输出为文本并将文本复制粘贴到文本编辑器中时,您将无法获得与原始文件相同的值(可能是因为Web浏览器会将其某些内容解释为HTML标记,或者复制粘贴会破坏一些二进制字符,或者文本编辑器本身会破坏它们)。

您应该做的是在向浏览器提供文件时设置适当的HTTP响应头,以便浏览器知道它是一个ZIP文件,并显示用户一个文件下载提示。如果您不发送任何响应头,则浏览器将只显示内容作为文本文件,这没有意义。

请查看此问题,其中有一个PHP解决方案:

https://stackoverflow.com/a/10817739/245966

基本上,您需要设置适当的Content-TypeContent-Disposition头,并(可选)Content-Length

setResponseHeader('Content-Disposition: attachment; filename=myfile.zip');
setResponseHeader('Content-Type: application/zip');
setResponseHeader('Content-Length: ' + fileLengthInBytes);

setResponseHeader替换为适当的调用您的HTTP框架以设置响应头。


0

您正在尝试将zip文件读取为字符编码(utf-8),这应该改为“二进制”


-1

如果我没有添加新模块的权限怎么办? - pee2pee
糟糕。根据我在Notepad++中打开的其他ZIP文件,使用我编写的代码输出到屏幕上“看起来很有前途”。 - pee2pee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接