79 lines
2.3 KiB
TypeScript
79 lines
2.3 KiB
TypeScript
import { NextResponse } from "next/server";
|
|||
|
|
import { createSupabaseRouteClient } from "@/lib/supabase/server";
|
||
|
|
|
||
|
|
export const dynamic = "force-dynamic";
|
||
|
|
|
||
|
|
export async function GET(request: Request) {
|
||
|
|
const supabase = await createSupabaseRouteClient();
|
||
|
|
const {
|
||
|
|
data: { user },
|
||
|
|
error: authError,
|
||
|
|
} = await supabase.auth.getUser();
|
||
|
|
|
||
|
|
if (authError || !user) {
|
||
|
|
return NextResponse.json({ error: "未登录" }, { status: 401 });
|
||
|
|
}
|
||
|
|
|
||
|
|
const { searchParams } = new URL(request.url);
|
||
|
|
const assetId = searchParams.get("assetId");
|
||
|
|
|
||
|
|
if (!assetId) {
|
||
|
|
return NextResponse.json({ error: "缺少 assetId" }, { status: 400 });
|
||
|
|
}
|
||
|
|
|
||
|
|
// 获取资源信息
|
||
|
|
const { data: asset, error: assetError } = await supabase
|
||
|
|
.from("media_assets")
|
||
|
|
.select("*")
|
||
|
|
.eq("id", assetId)
|
||
|
|
.single();
|
||
|
|
|
||
|
|
if (assetError || !asset) {
|
||
|
|
return NextResponse.json({ error: "资源不存在" }, { status: 404 });
|
||
|
|
}
|
||
|
|
|
||
|
|
// 对于图片,添加高质量参数以获得更好的显示效果
|
||
|
|
// Supabase Storage 支持通过 URL 参数控制图片质量和尺寸
|
||
|
|
const isImage = asset.mime_type?.startsWith("image/");
|
||
|
|
let signedUrl: string;
|
||
|
|
|
||
|
|
if (isImage) {
|
||
|
|
// 使用 createSignedUrl 并添加高质量参数
|
||
|
|
// 注意:transform 参数需要在签名时指定
|
||
|
|
const { data: signedUrlData, error: signError } = await supabase.storage
|
||
|
|
.from(asset.bucket)
|
||
|
|
.createSignedUrl(asset.storage_path, 60 * 60, {
|
||
|
|
// 添加转换参数以获得高质量图片
|
||
|
|
transform: {
|
||
|
|
quality: 95, // 高质量
|
||
|
|
format: "origin", // 保持原始格式
|
||
|
|
},
|
||
|
|
});
|
||
|
|
|
||
|
|
if (signError || !signedUrlData) {
|
||
|
|
return NextResponse.json({ error: "生成签名 URL 失败" }, { status: 500 });
|
||
|
|
}
|
||
|
|
signedUrl = signedUrlData.signedUrl;
|
||
|
|
} else {
|
||
|
|
// 非图片文件,直接生成签名 URL
|
||
|
|
const { data: signedUrlData, error: signError } = await supabase.storage
|
||
|
|
.from(asset.bucket)
|
||
|
|
.createSignedUrl(asset.storage_path, 60 * 60);
|
||
|
|
|
||
|
|
if (signError || !signedUrlData) {
|
||
|
|
return NextResponse.json({ error: "生成签名 URL 失败" }, { status: 500 });
|
||
|
|
}
|
||
|
|
signedUrl = signedUrlData.signedUrl;
|
||
|
|
}
|
||
|
|
|
||
|
|
return NextResponse.json({
|
||
|
|
signedUrl,
|
||
|
|
asset: {
|
||
|
|
id: asset.id,
|
||
|
|
file_name: asset.file_name,
|
||
|
|
mime_type: asset.mime_type,
|
||
|
|
file_size: asset.file_size,
|
||
|
|
},
|
||
|
|
});
|
||
|
|
}
|