89 lines
3.0 KiB
JavaScript
89 lines
3.0 KiB
JavaScript
import axios from 'axios';
|
||
import fs from 'fs';
|
||
import path from 'path';
|
||
|
||
const JINGROW_SERVER_URL = process.env.JINGROW_SERVER_URL;
|
||
const JINGROW_SITE_NAME = process.env.JINGROW_SITE_NAME;
|
||
const PUBLIC_FILES_DIR = path.join(process.cwd(), 'public/files');
|
||
|
||
// 确保目录存在
|
||
if (!fs.existsSync(PUBLIC_FILES_DIR)) {
|
||
fs.mkdirSync(PUBLIC_FILES_DIR, { recursive: true });
|
||
}
|
||
|
||
// 下载图片到本地public/files目录,返回本地路径
|
||
async function downloadToLocal(fileUrl) {
|
||
try {
|
||
// 判断是否为完整URL
|
||
let fullUrl = fileUrl;
|
||
if (!/^https?:\/\//.test(fileUrl)) {
|
||
// 相对路径,拼接服务器地址
|
||
fullUrl = `${JINGROW_SERVER_URL}${fileUrl}`;
|
||
}
|
||
// 取文件名
|
||
const fileName = path.basename(fullUrl.split('?')[0]);
|
||
const localPath = path.join(PUBLIC_FILES_DIR, fileName);
|
||
const localUrl = `/files/${fileName}`;
|
||
// 如果本地已存在则不再下载
|
||
if (!fs.existsSync(localPath)) {
|
||
const response = await axios.get(fullUrl, { responseType: 'stream' });
|
||
await new Promise((resolve, reject) => {
|
||
const writer = fs.createWriteStream(localPath);
|
||
response.data.pipe(writer);
|
||
writer.on('finish', resolve);
|
||
writer.on('error', reject);
|
||
});
|
||
}
|
||
return localUrl;
|
||
} catch (e) {
|
||
return fileUrl; // 下载失败返回原始路径
|
||
}
|
||
}
|
||
|
||
export async function GET(request) {
|
||
try {
|
||
const { searchParams } = new URL(request.url);
|
||
const component_name = searchParams.get('component_name');
|
||
if (!component_name) {
|
||
return Response.json({ error: '缺少component_name参数' }, { status: 400 });
|
||
}
|
||
const response = await axios.get(
|
||
`${JINGROW_SERVER_URL}/api/action/jsite.api.v1.get_component_data`,
|
||
{ params: { component_name, site_name: JINGROW_SITE_NAME } }
|
||
);
|
||
let data = response.data.message?.data || {};
|
||
|
||
// 处理主图片字段和icon、file_src
|
||
for (const key of ['image', 'image_1', 'image_2', 'icon', 'file_src']) {
|
||
if (data[key]) {
|
||
data[key] = await downloadToLocal(data[key]);
|
||
}
|
||
}
|
||
// 处理items数组中的item_image、item_video_src、item_file_src、item_icon
|
||
if (Array.isArray(data.items)) {
|
||
for (const item of data.items) {
|
||
if (item.item_image) {
|
||
item.item_image = await downloadToLocal(item.item_image);
|
||
}
|
||
if (item.item_video_src) {
|
||
// 只有相对路径才下载到本地,完整URL直接返回原始URL
|
||
if (!/^https?:\/\//.test(item.item_video_src)) {
|
||
item.item_video_src = await downloadToLocal(item.item_video_src);
|
||
}
|
||
}
|
||
if (item.item_file_src) {
|
||
item.item_file_src = await downloadToLocal(item.item_file_src);
|
||
}
|
||
if (item.item_icon) {
|
||
item.item_icon = await downloadToLocal(item.item_icon);
|
||
}
|
||
}
|
||
}
|
||
return Response.json({ data });
|
||
} catch (error) {
|
||
return Response.json(
|
||
{ error: error.message, detail: error?.response?.data || null },
|
||
{ status: 500 }
|
||
);
|
||
}
|
||
}
|