如何循环同步下载文件

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

        }
相关推荐
时空系6 分钟前
认识Rust——我的第一个程序 Rust中文编程
开发语言·后端·rust
yqcoder8 分钟前
JavaScript 柯里化:把“大餐”拆成“小炒”的艺术
开发语言·javascript·ecmascript
每天吃饭的羊14 分钟前
JSZip的使用
开发语言·javascript
qq_5895681023 分钟前
java基础学习,案例练习,即时通讯
java·开发语言·学习
DevilSeagull33 分钟前
Windows 批处理 (Batch) 编程: 从入门到入土. (一) 基础概念与环境配置
开发语言·windows·后端·batch·语言
AI科技星38 分钟前
全域数学·第卷:场计算机卷(场空间计算机)【乖乖数学】
java·开发语言·人工智能·算法·机器学习·数学建模·数据挖掘
charlie1145141911 小时前
嵌入式C++实践开发第21篇(单片机实践):按钮输入 —— 硬件原理、消抖与HAL API
开发语言·c++·单片机
前端老石人1 小时前
前端开发中的 URL 完全指南
开发语言·前端·javascript·css·html
0xDevNull1 小时前
Java泛型详解
java·开发语言·后端