我的服务端部署在本地,所以其实是本地去获取本地文件。。。。
用到了个a标签,标签上
<a href="api/export?path=assets/jobs/16562003-18ae-4325-9b03-809aa2f073a7_2/input/files&versionName=2">
</a>
利用a标签的点击事件
后端最终的代码 ,核心部分就是最后,用流实现的,也没有生成压缩文件(这是最得意的),但是可以下载到tar文件
const url = new URL('https:/'+ req.url);
const filePath = path.resolve(__dirname, "./"+ url.searchParams.get('path'));
const versionName = url.searchParams.get('versionName')? url.searchParams.get('versionName')+'.tar' :'file.tar'
if (!filePath)
return res.send({
state: 1,
message: "Failed to find the path of the version!"
});
res.setHeader('Content-type', 'application/octet-stream');
res.setHeader('Content-Disposition', 'attachment;filename='+versionName);
const destFilePath = filePath+'.tar';
function handleErr(err){
return res.send({
state: 1,
message: "Failed to get the version!"
});
}
const tarStream = new compressing.tar.Stream();
tarStream ------------------------// 核心的就这点
.on('error',handleErr)
.pipe(res)
.on('error',handleErr)
.on('finish',function(){
console.log("finish")
后端node部分,我第一次写的如下,我的意思是先压缩,用到了comressing这个库,然后传完了之后再删除压缩的文件
router.route("/export").get((req,res) =>{
const url = new URL('https:/'+ req.url);
const filePath = path.resolve(__dirname, "./"+ url.searchParams.get('path'));
const versionName = url.searchParams.get('versionName')? url.searchParams.get('versionName')+'.tar' :'file.tar'
if (!filePath)
return res.send({
state: 1,
message: "Failed to find the path of the version!"
});
res.setHeader('Content-type', 'application/octet-stream');
res.setHeader('Content-Disposition', 'attachment;filename='+versionName);
const destFilePath = filePath+'.tar';
compressing.tar.compressDir(filePath, destFilePath)
.then(() => {
console.log("success")
var fileStream = fs.createReadStream(destFilePath);
fileStream.on('data', function (data) {
res.write(data, 'binary');
});
fileStream.on('end', function () {
res.end();
fs.unlink(destFilePath,function(err,data){
if (err) return console.log(err);
})
});
})
.catch(err => {
console.error(err);
});
}
第二次看到流的写法,又写了一次
function handleErr(err){
console.log(err);
return res.send({
state: 1,
message: "Failed to get the version!"
});
}
console.log(filePath)
console.log(destFilePath)
const tarStream = new compressing.tar.Stream();
tarStream.addEntry(filePath);
tarStream
.on('error',handleErr)
.pipe(fs.createWriteStream(destFilePath))
.on('error',handleErr)
.on('finish',function(){
console.log("finish")
fs.createReadStream(destFilePath)
.pipe(res)
.on('error',handleErr)
.on('finish',function(){
fs.unlink(destFilePath,handleErr)
})
//fs.unlink(destFilePath,handleErr)
})