本系列文章是本人学习相关知识时所积累的笔记,以记录自己的学习历程,也为了方便回顾知识;故文章内容较为随意简练,抱着学习目的来的同学务必转移他处,以免我误人子弟~
最近工作上碰到需求,要将网上爬取的试卷题目中的图片转存到自己公司的服务器,我打算在前端获取图片数据后再上传到服务器,却发现对方的图片资源不允许跨域请求,所以需要在后台请求数据并传到服务器。 我使用的是axios做请求模块,下载图片到本地电脑,再将图片上传到阿里云。
axios请求下载
// url 是图片地址,如,http://wximg.233.com/attached/image/20160815/20160815162505_0878.png
// filepath 是文件下载的本地目录
// name 是下载后的文件名
async function downloadFile(url: string, filepath: string, name: string) {
if (!fs.existsSync(filepath)) {
fs.mkdirSync(filepath);
}
const mypath = path.resolve(filepath, name);
const writer = fs.createWriteStream(mypath);
const response = await Axios({
url,
method: "GET",
responseType: "stream",
});
response.data.pipe(writer);
return new Promise((resolve, reject) => {
writer.on("finish", resolve);
writer.on("error", reject);
});
}
- 首先判断是否存在需要目录(
fs.existsSync()
),不存在则创建目录(fs.mkdirSync()
) - 创建写入对象(
fs.createWriteStream()
),其中 mypath 是完整的文件路径 - 请求文件数据,获取到的数据为二进制数据流(
response.data
) - 使用管道实现流的写入(
binaryData.pipe(writer)
) - 监听写入对象的状态,最终实现文件下载
fs.copyFileSync(tempPath, projectPath);
在测试环境中,资源上传到本地硬盘(项目目录)
实现的原理就是将下载到临时目录的文件资源复制到项目目录(fs.copyFileSync()
),供项目前端请求。
更多关于nodejs-fs文件模块的方法:简书:node.js之fs模块