当前位置: 首页 > news >正文

如何循环同步下载文件

1.下载同步下载代码,请求超时时间30秒:

async function downloadFile(url, filePath, timeoutMs = 30000) {return new Promise((resolve, reject) => {// 创建超时定时器const timeout = setTimeout(() => {reject(new Error(`下载超时 (${timeoutMs}ms)`));}, timeoutMs);const request = https.get(url, (response) => {const fileStream = fs.createWriteStream(filePath);response.pipe(fileStream);fileStream.on('finish', () => {clearTimeout(timeout); // 清除超时定时器fileStream.close(resolve); // 关闭文件流并解析Promise});fileStream.on('error', (err) => {clearTimeout(timeout);fs.unlink(filePath, () => {}); // 删除文件reject(err);});response.on('error', (err) => {clearTimeout(timeout);fs.unlink(filePath, () => {});reject(err);});});request.on('error', (err) => {clearTimeout(timeout);fs.unlink(filePath, () => {});reject(err);});// 确保在Promise结束时清除超时Promise.resolve().then(() => {}).catch(() => {}).finally(() => {clearTimeout(timeout);});});}

2.组装文件全路径,判断是否存在该文件,若不存在就下载:

async function downloadItemFile(url, directoryPath, id, is_photo) {let fileName = path.basename(url); // 获取文件名if(is_photo){fileName = fileName + '.jpeg';}else{fileName = fileName + '.mp4';}const filePath = path.join(directoryPath, fileName); // 获取文件保存路径if(!files.includes(fileName)){logger.debug('url:', url, 'fileName:', fileName,  'propertyListing.outh_id:', id);list1.push(url);fs.mkdir(directoryPath, { recursive: true }, (err) => {if (err) {console.error(`Error creating folder ${directoryPath}:${err.message}`);} else {console.log(`Folder ${directoryPath} created`);}}); await downloadFile(url, filePath);}}

3.循环一个文件一个文件的下载:
await downloadItemFile(item.url, directoryPath1, propertyListing.out_id, false);和await downloadFile(url, filePath);注意:一定要加await不然就变成同步下载了。若有多个文件需要下载就会一次建立多个http请求去异步下载,会出现图片和视频下载不完整的问题。

        for(let i = 0; (i < list.length) && (i < m); i++){let propertyListing = list[i];if(Tool.checkNotEmptString(propertyListing.out_id)){// if(Tool.checkNotEmptArray(propertyListing.photos)){//     for(let photo of propertyListing.photos){//         if(Tool.checkNotEmptString(photo.url)){//             downloadItemFile(photo.url, directoryPath1, propertyListing.id, true);//         }      //     }// }else if(Tool.checkNotEmptArray(propertyListing.videos)){for(let item of propertyListing.videos){if(Tool.checkNotEmptString(item.url)){await downloadItemFile(item.url, directoryPath1, propertyListing.out_id, false);}      }}}}
http://www.dtcms.com/a/355740.html

相关文章:

  • Yolov8 pose 推理部署笔记
  • HTML应用指南:利用POST请求获取全国中国工商银行网点位置信息
  • 序列化,应用层自定义协议
  • 万博智云联合华为云共建高度自动化的云容灾基线解决方案
  • 浅谈JMeter Listener
  • 自学嵌入式第三十天:Linux系统编程-线程的控制
  • 因果推断在解决多触点归因问题上的必要性
  • 利用ollama部署本地大模型 离线使用
  • 告别Java依赖!GISBox三维场景编辑+服务发布一站式工具横评
  • 模型汇总-数学建模
  • echarts碰到el-tabs首次加载echarts宽度只有100px
  • LoRA模型的可训练参数解析(61)
  • 杂记 08
  • CnSTD+CnOCR的联合使用
  • vsgCs显示谷歌全球倾斜模型-节点
  • 9 从 “内存怎么存” 到 “指针怎么用”:计算机内存编址机制 + C 语言指针核心 + memory 模拟实现
  • “AI+制造”政策下,户外智能清洁如何跑出加速度?
  • 20250828-学习JumpServer开源堡垒机使用:统一访问入口 + 安全管控 + 操作审计
  • 复杂BI报表SQL
  • 集成电路学习:什么是TensorFlow
  • MCP Factory——专业 MCP Server 开发平台,正式发布,免费下载!
  • 一站式爬虫MCP服务器助力AI市场分析师
  • 微服务相关面试题
  • ComfyUI ControlNet 保姆级教程:开箱即用的示例工作流,精准控制AI图像生成
  • 记录git报错ssh: connect to host github.com port 22: Connection timed out,已解决
  • P3373 【模板】线段树 2
  • l六步完成麒麟操作系统挂载本地REPO源
  • 软考 系统架构设计师系列知识点之杂项集萃(134)
  • IPv6过渡技术IPv6 over IPv4
  • 【数据结构与算法】LeetCode 20.有效的括号