节点:通过请求下载zip,zip已损坏
Node: Downloading a zip through Request, Zip being corrupted
我正在为一个小型命令行工具使用优秀的Request库来下载Node中的文件。Request非常适合拉入单个文件,没有任何问题,但它不适用于ZIP。
例如,我正在尝试下载Twitter Bootstrap档案,它位于URL:
http://twitter.github.com/bootstrap/assets/bootstrap.zip
代码的相关部分是:
var fileUrl = "http://twitter.github.com/bootstrap/assets/bootstrap.zip";
var output = "bootstrap.zip";
request(fileUrl, function(err, resp, body) {
if(err) throw err;
fs.writeFile(output, body, function(err) {
console.log("file written!");
}
}
我也尝试过将编码设置为"二进制",但没有成功。实际的zip大约是74KB,但当通过上面的代码下载时,它大约是134KB,双击Finder提取它时,我会得到错误:
无法将"引导程序"提取到"节点测试"中(错误21-是目录)
我觉得这是一个编码问题,但不知道该怎么办。
是的,问题出在编码上。当您等待整个传输完成时,默认情况下body
被强制为字符串。您可以通过将encoding
选项设置为null
:来告诉request
给您一个Buffer
var fileUrl = "http://twitter.github.com/bootstrap/assets/bootstrap.zip";
var output = "bootstrap.zip";
request({url: fileUrl, encoding: null}, function(err, resp, body) {
if(err) throw err;
fs.writeFile(output, body, function(err) {
console.log("file written!");
});
});
另一个更优雅的解决方案是使用pipe()
将响应指向文件可写流:
request('http://twitter.github.com/bootstrap/assets/bootstrap.zip')
.pipe(fs.createWriteStream('bootstrap.zip'))
.on('close', function () {
console.log('File written!');
});
一句话总是赢的:)
pipe()
返回目标流(在本例中为WriteStream),因此您可以侦听其close
事件以在写入文件时得到通知。
我在搜索一个函数,该函数请求zip并提取它,而不在服务器内创建任何文件,这是我的TypeScript函数,它使用JSZIP模块和request:
let bufs : any = [];
let buf : Uint8Array;
request
.get(url)
.on('end', () => {
buf = Buffer.concat(bufs);
JSZip.loadAsync(buf).then((zip) => {
// zip.files contains a list of file
// chheck JSZip documentation
// Example of getting a text file : zip.file("bla.txt").async("text").then....
}).catch((error) => {
console.log(error);
});
})
.on('error', (error) => {
console.log(error);
})
.on('data', (d) => {
bufs.push(d);
})
相关文章:
- 检测图像URL是否已损坏JQUERY
- 节点:通过请求下载zip,zip已损坏
- 将 MVC 3 应用程序部署到 URL 文件夹已损坏 JavaScript 和内容路径
- 从 Base64 转换图像时出错 - HTMLImageElement 已损坏
- 异步加载JQuery时Tabbed Box已损坏
- Angular 2-检查图像url是否有效或已损坏
- JCrop使用集合选择选项时插件已损坏
- Jquery提交表单已损坏
- MongoDB 在保存数据时抛出错误(拓扑已损坏)
- iOS 7 全屏 Web 应用程序中的 JavaScript 警报已损坏
- MongoDB本机节点驱动程序:解释已损坏
- 已选择选项已损坏或.
- Base64 - 文件已损坏
- 我的 mailto 链接中的换行符在 Android 手机上已损坏
- 为什么 Chrome 扩展程序图片在添加到 DOM 时显示为已损坏
- $parent变量在ng-include上从单独的控制器设置时已损坏
- base64 映像已损坏上传到 S3
- .fadeIn()和.fadeOut()函数已损坏
- D3.js enter()对于svg形状动画已损坏,但更新和删除它们都很好
- 下载的zip文件已损坏