如何循环同步下载文件

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

        }
相关推荐
立志成为大牛的小牛1 小时前
数据结构——二十六、邻接表(王道408)
开发语言·数据结构·c++·学习·程序人生
祈祷苍天赐我java之术1 小时前
Redis 数据类型与使用场景
java·开发语言·前端·redis·分布式·spring·bootstrap
MediaTea2 小时前
Python 第三方库:matplotlib(科学绘图与数据可视化)
开发语言·python·信息可视化·matplotlib
JS.Huang2 小时前
【JavaScript】原生函数
开发语言·javascript·ecmascript
533_3 小时前
[vue] dayjs 显示实时时间
前端·javascript·vue.js
CoderCodingNo3 小时前
【GESP】C++五级考试大纲知识点梳理, (5) 算法复杂度估算(多项式、对数)
开发语言·c++·算法
ftpeak3 小时前
JavaScript性能优化实战
开发语言·javascript·性能优化
一个很帅的帅哥4 小时前
JavaScript事件循环
开发语言·前端·javascript
驰羽4 小时前
[GO]gin框架:ShouldBindJSON与其他常见绑定方法
开发语言·golang·gin
程序员大雄学编程4 小时前
「用Python来学微积分」5. 曲线的极坐标方程
开发语言·python·微积分