| import { NextRequest, NextResponse } from "next/server"; |
|
|
| |
| 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"; |
|
|