如何循环同步下载文件

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

        }
相关推荐
Cobyte2 分钟前
17.响应式系统比对:链表如何实现响应式系统的高效更新
前端·javascript·vue.js
虚心的百褶裙30 分钟前
JavaScript性能优化
开发语言·javascript·性能优化
凯瑟琳.奥古斯特36 分钟前
二分查找解力扣1011最优运载能力
开发语言·c++·算法·leetcode·职场和发展
Tim_101 小时前
【C++】014、左值与右值的区别
开发语言·c++
凯小默1 小时前
10.JavaScript 中的类和对象以及继承
javascript·继承
AI视觉网奇1 小时前
BambuStudio 自定义加载页面
服务器·前端·javascript
天空'之城1 小时前
Linux 系统编程 14:Reactor 反应堆模式
linux·开发语言·网络编程·reactor 反应堆模式
Zhou1411361 小时前
Java常见面试题7
java·开发语言
^yi1 小时前
【C++】类和对象(全)
开发语言·c++
万亿少女的梦1681 小时前
基于Node.js和Express的旅游信息管理平台设计与开发
mysql·node.js·express·系统设计·旅游信息管理