Node的一些文件操作问题
常用的读取文件的模块:fs
压缩一个文件
使用的是node-archiver
链接:https://github.com/archiverjs/node-archiver
/**
* 将目标文件夹打包
* @param dirname 所需要打包文件或文件夹所在的目录
* @param filename 所需打包的文件/目录名称,也是打包后的zip名称
*/
static async zip(dirname:string,filename:string){
let archive = archiver('zip', {
zlib: { level: 9 } // 设置压缩级别
});
let output = fs.createWriteStream(dirname+`/${filename}.zip`);
console.log("file is zipping!");
archive.pipe(output);
archive.directory(dirname+filename+"/",false);
await archive.finalize();
console.log("Util.zip:"+fs.existsSync(dirname+`/${filename}.zip`));
}
文件哈希值
使用的是node-crypto
/**
* 获取文件哈希值
* @param path
* @returns
*/
function createFileHash256Sync(path:string):any {
//读取一个Buffer
const buffer = fs.readFileSync(path);
const fsHash = crypto.createHash('sha256');
fsHash.update(buffer);
const md5 = fsHash.digest('hex');
return md5;
}
使用Form-Data发送压缩文件
使用node-FormData模块
一定记得 import FormData = require(“form-data”); 不然自带的form-data内容只支持blob或者string
传递readStream
// 填充文件
form.append("file",fs.createReadStream(zipPath),{
contentType:"application/octet-stream"
});
// 如果使用form-data传递json对象,要转换成string进行传递
// 填充参数
form.append("parameters", JSON.stringify({
"filehash":filehash,
"boardType":config.boardType,
"compileType":config.compileType
}),{
contentType:"application/json"
});
封装好之后进行发送时发现node-fetch不支持form-data,request支持的formData格式非常简单不是我们用的那种封装好的from-data,所以这里使用其他方式发送请求。
form-data发送请求
let form = new FormData();
form.append("file", fs.createReadStream(zipPath));
// 向C提交文件数据
form.submit('http://10.33.200.1:8700/api/upload', function(err, res) {
res.resume();
return res.send({
code:200,
message:'成功'
})
});
got发送请求
使用got模块
链接:https://github.com/sindresorhus/got
npm install got
import {FormData} from "formdata-node"
// I assume Got >= 12.x is used for this example
import got from "got"
const form = new FormData()
form.set("greeting", "Hello, World!")
const data = await got.post("https://httpbin.org/post", {body: form}).json()
console.log(data.form.greeting) // => Hello, World!
编码后使用fetch
import {Readable} from "stream"
import {FormDataEncoder} from "form-data-encoder"
import {FormData} from "formdata-node"
// Note that `node-fetch` >= 3.x have builtin support for spec-compliant FormData, sou you'll only need the `form-data-encoder` if you use `node-fetch` <= 2.x.
import fetch from "node-fetch"
const form = new FormData()
form.set("field", "Some value")
const encoder = new FormDataEncoder(form)
const options = {
method: "post",
headers: encoder.headers,
body: Readable.from(encoder)
}
await fetch("https://httpbin.org/post", options)
File对象发送fetch
import {FormData, File} from "formdata-node" // You can use `File` from fetch-blob >= 3.x
import fetch from "node-fetch"
const form = new FormData()
const file = new File(["My hovercraft is full of eels"], "file.txt")
form.set("file", file)
await fetch("https://httpbin.org/post", {method: "post", body: form})