node 下载图片到本地

本文介绍了如何在Node.js环境下实现从文件中刷选图片URL,下载图片到与文件同名的文件夹,并将文件中的网络URL替换为本地路径。详细步骤包括引入相关模块、获取文件目录、遍历文件读取图片URL、下载保存图片以及使用正则表达式更新文件中的图片链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

图片下载

一.需求

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)
        })
})

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值