如何循环同步下载文件

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 小时前
婚纱摄影网站|基于ssm + vue婚纱摄影网站系统(源码+数据库+文档)
前端·javascript·数据库·vue.js·spring boot·后端
Boilermaker19926 小时前
[Java 并发编程] Synchronized 锁升级
java·开发语言
MM_MS7 小时前
Halcon变量控制类型、数据类型转换、字符串格式化、元组操作
开发语言·人工智能·深度学习·算法·目标检测·计算机视觉·视觉检测
꧁Q༒ོγ꧂7 小时前
LaTeX 语法入门指南
开发语言·latex
njsgcs7 小时前
ue python二次开发启动教程+ 导入fbx到指定文件夹
开发语言·python·unreal engine·ue
alonewolf_997 小时前
JDK17新特性全面解析:从语法革新到模块化革命
java·开发语言·jvm·jdk
古城小栈8 小时前
Rust 迭代器产出的引用层数——分水岭
开发语言·rust
ghie90908 小时前
基于MATLAB的TLBO算法优化实现与改进
开发语言·算法·matlab
恋爱绝缘体18 小时前
2020重学C++重构你的C++知识体系
java·开发语言·c++·算法·junit
wuk9988 小时前
VSC优化算法MATLAB实现
开发语言·算法·matlab