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