kanban / src /app /api /proxy /image /route.ts
Leon4gr45's picture
Deploy magic-resume as Docker Space (port 3000)
c30ea2a verified
Raw
History Blame Contribute Delete
3.38 kB
import { NextRequest, NextResponse } from "next/server";
// resolve image proxy
export async function GET(request: NextRequest) {
try {
const { searchParams } = new URL(request.url);
const imageUrl = searchParams.get("url");
if (!imageUrl) {
console.error("缺少图片URL参数");
return NextResponse.json({ error: "缺少图片URL参数" }, { status: 400 });
}
let parsedUrl;
try {
parsedUrl = new URL(imageUrl);
} catch (e) {
console.error(`图片URL格式不正确: ${imageUrl}`);
return NextResponse.json({ error: "图片URL格式不正确" }, { status: 400 });
}
if (parsedUrl.protocol !== "http:" && parsedUrl.protocol !== "https:") {
console.error(`不支持的URL协议: ${parsedUrl.protocol}`);
return NextResponse.json(
{ error: "只支持HTTP和HTTPS协议" },
{ status: 400 }
);
}
let response;
try {
response = await fetch(imageUrl, {
headers: {
// 模拟浏览器请求
"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
Accept:
"image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
Referer: parsedUrl.origin,
},
});
} catch (error: any) {
console.error(`获取图片失败: ${error.message || "未知错误"}`);
return NextResponse.json(
{ error: `获取图片失败: ${error.message || "未知错误"}` },
{ status: 500 }
);
}
// 检查响应状态
if (!response.ok) {
console.error(
`图片服务器返回错误: ${response.status} ${response.statusText}`
);
return NextResponse.json(
{ error: `获取图片失败: ${response.status} ${response.statusText}` },
{ status: response.status }
);
}
let imageBuffer;
try {
imageBuffer = await response.arrayBuffer();
console.log(`成功获取图片,大小: ${imageBuffer.byteLength} 字节`);
} catch (error: any) {
console.error(`读取图片内容失败: ${error.message || "未知错误"}`);
return NextResponse.json(
{ error: `读取图片内容失败: ${error.message || "未知错误"}` },
{ status: 500 }
);
}
if (imageBuffer.byteLength === 0) {
console.error("图片内容为空");
return NextResponse.json({ error: "图片内容为空" }, { status: 400 });
}
const contentType = response.headers.get("content-type") || "image/jpeg";
return new NextResponse(imageBuffer, {
headers: {
"Content-Type": contentType,
"Cache-Control":
"no-store, no-cache, must-revalidate, proxy-revalidate",
Pragma: "no-cache",
Expires: "0",
"Surrogate-Control": "no-store",
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "GET, OPTIONS",
"Access-Control-Allow-Headers": "Content-Type",
},
});
} catch (error: any) {
console.error("图片代理未处理的错误:", error);
return NextResponse.json(
{ error: `处理图片请求时出错: ${error.message || "未知错误"}` },
{ status: 500 }
);
}
}
export const runtime = "edge";