最近在做我的网站的时候,发现调用nano banana接口时,返回的图片是一个国外地址,国内在客户端加载的时候会比较慢。于是研究了下如何提高速度,问了AI找到一个简单的方法,就是使用服务器代理。
php
export async function GET(request: NextRequest) {
try {
const { searchParams } = new URL(request.url);
const imageUrl = searchParams.get('url');
if (!imageUrl) {
return NextResponse.json({ error: 'Missing image URL' }, { status: 400 });
}
// 验证URL是否安全
if (!imageUrl.startsWith('http://') && !imageUrl.startsWith('https://')) {
return NextResponse.json({ error: 'Invalid URL' }, { status: 400 });
}
// 下载图片
const response = await fetch(imageUrl, {
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Accept': 'image/*',
},
// 设置超时
signal: AbortSignal.timeout(30000), // 30秒超时
});
if (!response.ok) {
return NextResponse.json({ error: 'Failed to fetch image' }, { status: 500 });
}
const imageBuffer = await response.arrayBuffer();
const contentType = response.headers.get('content-type') || 'image/jpeg';
// 返回图片数据,设置缓存头
return new NextResponse(imageBuffer, {
headers: {
'Content-Type': contentType,
'Cache-Control': 'public, max-age=31536000, immutable', // 缓存1年
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET',
'Access-Control-Allow-Headers': 'Content-Type',
'Content-Length': imageBuffer.byteLength.toString(),
},
});
} catch (error) {
console.error('Proxy image error:', error);
return NextResponse.json({ error: 'Internal server error' }, { status: 500 });
}
}
然后在后端生成图片之后,调用服务器代理。
javascript
if (generatedImageUrl && typeof generatedImageUrl === 'string' && generatedImageUrl.startsWith('http')) {
try {
// 使用代理URL,这样图片会通过你的服务器加载,速度更快
const proxyUrl = `/api/proxy-image?url=${encodeURIComponent(generatedImageUrl)}`;
generatedImageUrl = proxyUrl;
} catch (conversionError) {
console.error('Failed to create proxy URL:', conversionError);
// 如果转换失败,保持原URL
}
}
这样处理之后,加载图片快多了。不知道这样会不会对服务端性能有啥影响,有其他更好的办法吗,比如在服务端转化为base64位图片。