node 下载图片到本地

图片下载

一.需求

1.json文件刷选出imageUrl
2.下载的图片必须保存载与json文件同名的文件夹中
3.将json文件中原网络地址改为json文件本地路径

二.分析

1. 采用node
2.获取存储数据data文件夹中的文件目录
3.遍历目录,获取json文件中,图片imgUrl
4.下载imgUrl,保存到本地目录中
5.将json文件中的imgUrl改为本地路径

三.代码实现分解

1.引入模块

	let fs = require('fs');       //引入文件读取模块
	let request = require('request')

2.获取data的文件目录
在这里插入图片描述

	let list = fs.readdirSync('./Data')
	console.log(list)       // [ 'diet.json', 'healthplan.json', 'materials.json' ]

3.遍历list,读取每个json文件,获取imgUrl路径

 list.forEach(file=>{
	// 可以通过 递归的方式获取imageUrl,
	// 也可以通过正则匹配,我这里主要介绍正则匹配
	  let contentText = fs.readFileSync(`./Data/${file}`,'utf-8');
      let arr =  contentText.match(/http[s]?:\/\/.+\.(jpg|gif|png)/g)
})

只截取某一个json文件中的部分:
在这里插入图片描述
4.通过获取到的imageUrl将图片下载到本地

   arr.forEach((url,idx)=>{
   		let filename =  url.split('/').pop()  // 已原网络图片的名称命名本地图片
                request({url}).pipe(
                        fs.createWriteStream(`./images/${filename}`).on('close',err=>{  console.log('写入失败',err) })
                )   
    })

图片都被保存在images文件夹下,且文件名都使用原名称保存
在这里插入图片描述
5.我想将本地json文件中的imageUrl网络地址改为 本地地址

可以直接使用正则匹配出图片地址,将原地址替换,可以使用replace,但是之前使用过match匹配过,为了节省一次匹配,我打算将方法3中的正则修改为

let arr = []
contentText = contentText.replace(/http[s]?:\/\/.+\.(jpg|gif|png)/g,res=>{
      let filename =  res.split('/').pop()
	arr.push(res)  // 匹配到的地址存于 arr中
	 return  `./images/${filename}`  // 同时将contentText 中的内容修改
})

// 将json 文件重新写入
fs.writeFile(`./Data/${file}`, contentText,res=>{
     console.log(res)
 })

四.代码实现

let fs = require('fs');//引入文件读取模块
let request = require('request')
let list = fs.readdirSync('./Data')

list.forEach(file => {
      let contentText = fs.readFileSync(`./Data/${file}`,'utf-8');

        let arr = []
       contentText =  contentText.replace(/http[s]?:\/\/.+\.(jpg|gif|png)/g,res=>{
                let filename =  res.split('/').pop()
                arr.push(res)
                return  `.images/${filename}`
       })
       
       arr.forEach((url,idx)=>{
                let filename =  url.split('/').pop()
                request({url}).pipe(
                        fs.createWriteStream(`./images/${filename}`).on('close',err=>{  
                                console.log('sdfsd',err) })
                )     
       })
      
       fs.writeFile(`./Data/${file}`, contentText,res=>{
                console.log(res)
        })
})

以上是我个人总结,如果您还有更好的方法,欢迎指正,谢谢!

发布了45 篇原创文章 · 获赞 14 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/cmchenmei/article/details/99410995