|
|
|
|
|
|
|
|
|
|
|
const XLSX = require('xlsx'); |
|
|
|
|
|
const axios = require('axios'); |
|
|
|
|
|
const path = require('path'); |
|
|
|
|
|
const url = require('url'); |
|
|
|
|
|
const fs = require('fs').promises; |
|
|
|
|
|
const { existsSync, mkdirSync } = require('fs'); |
|
|
|
|
|
|
|
|
|
|
|
// 获取文件名从URL |
|
|
|
|
|
function getFilenameFromUrl(urlString) { |
|
|
|
|
|
try { |
|
|
|
|
|
const parsed = new URL(urlString); |
|
|
|
|
|
let filename = path.basename(parsed.pathname); |
|
|
|
|
|
// 如果文件名为空或无效,生成时间戳文件名 |
|
|
|
|
|
if (!filename || !filename.includes('.')) { |
|
|
|
|
|
const timestamp = Date.now(); |
|
|
|
|
|
filename = `image_${timestamp}.jpg`; |
|
|
|
|
|
} |
|
|
|
|
|
return filename; |
|
|
|
|
|
} catch (error) { |
|
|
|
|
|
console.error(`Error parsing URL ${urlString}: ${error.message}`); |
|
|
|
|
|
const timestamp = Date.now(); |
|
|
|
|
|
return `image_${timestamp}.jpg`; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 下载图片 |
|
|
|
|
|
async function downloadImage(imageUrl, outputPath) { |
|
|
|
|
|
try { |
|
|
|
|
|
const response = await axios({ |
|
|
|
|
|
method: 'GET', |
|
|
|
|
|
url: imageUrl, |
|
|
|
|
|
responseType: 'arraybuffer' |
|
|
|
|
|
}); |
|
|
|
|
|
await fs.writeFile(outputPath, response.data); |
|
|
|
|
|
console.log(`Downloaded: ${outputPath}`); |
|
|
|
|
|
} catch (error) { |
|
|
|
|
|
console.error(`Error downloading image ${imageUrl}: ${error.message}`); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 处理Excel文件 |
|
|
|
|
|
async function processExcel() { |
|
|
|
|
|
try { |
|
|
|
|
|
// 获取当前目录下的第一个xlsx文件 |
|
|
|
|
|
const files = await fs.readdir('.'); |
|
|
|
|
|
const xlsxFile = files.find(file => file.endsWith('.xlsx')); |
|
|
|
|
|
|
|
|
|
|
|
if (!xlsxFile) { |
|
|
|
|
|
console.log("No xlsx file found in current directory"); |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 读取Excel文件 |
|
|
|
|
|
const workbook = XLSX.readFile(xlsxFile); |
|
|
|
|
|
const worksheet = workbook.Sheets[workbook.SheetNames[0]]; |
|
|
|
|
|
|
|
|
|
|
|
// 转换为JSON,跳过前4行 |
|
|
|
|
|
const data = XLSX.utils.sheet_to_json(worksheet, { |
|
|
|
|
|
header: 1, |
|
|
|
|
|
range: 4 // 从第5行开始 (0-based index) |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
// 处理每一行 |
|
|
|
|
|
for (const row of data) { |
|
|
|
|
|
if (!row[1]) continue; // B列为空则跳过 |
|
|
|
|
|
|
|
|
|
|
|
const folderName = row[1].toString().trim(); |
|
|
|
|
|
const imageUrl1 = row[17]; // R列 |
|
|
|
|
|
const imageUrl2 = row[18]; // S列 |
|
|
|
|
|
|
|
|
|
|
|
if (!folderName) continue; |
|
|
|
|
|
|
|
|
|
|
|
// 创建文件夹 |
|
|
|
|
|
const folderPath = `./goods/${folderName}`; |
|
|
|
|
|
if (!existsSync(folderPath)) { |
|
|
|
|
|
mkdirSync(folderPath, { recursive: true }); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 创建Details子文件夹 |
|
|
|
|
|
const detailsPath = path.join(folderPath, 'details'); |
|
|
|
|
|
if (!existsSync(detailsPath)) { |
|
|
|
|
|
mkdirSync(detailsPath, { recursive: true }); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 下载R列图片 |
|
|
|
|
|
if (imageUrl1) { |
|
|
|
|
|
const filename1 = getFilenameFromUrl(imageUrl1); |
|
|
|
|
|
await downloadImage(imageUrl1, path.join(folderPath, filename1)); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 下载S列的多个图片 |
|
|
|
|
|
if (imageUrl2) { |
|
|
|
|
|
const imageUrls = imageUrl2.split('$$').filter(url => url.trim()); |
|
|
|
|
|
for (let i = 0; i < imageUrls.length; i++) { |
|
|
|
|
|
const imageUrl = imageUrls[i].trim(); |
|
|
|
|
|
if (imageUrl) { |
|
|
|
|
|
const filename = getFilenameFromUrl(imageUrl); |
|
|
|
|
|
await downloadImage(imageUrl, path.join(detailsPath, filename)); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
console.log("Processing completed!"); |
|
|
|
|
|
|
|
|
|
|
|
} catch (error) { |
|
|
|
|
|
console.error(`Error processing Excel file: ${error.message}`); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 运行程序 |
|
|
|
|
|
processExcel().catch(console.error); |