如何循环同步下载文件
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);} }}}}