0.1.14 上线前更改
This commit is contained in:
@@ -1,8 +1,28 @@
|
||||
import { NextResponse } from "next/server";
|
||||
import supabaseAdmin from "@/lib/supabase/admin";
|
||||
import { rewriteToPublicOrigin } from "@/lib/url/rewritePublicOrigin";
|
||||
|
||||
export const dynamic = "force-dynamic";
|
||||
|
||||
const applyHostOverride = (rawUrl: string, hostOverride: string) => {
|
||||
try {
|
||||
const u = new URL(rawUrl);
|
||||
|
||||
// 支持两种写法:hostname 或完整 origin(https://xxx:port)
|
||||
if (/^https?:\/\//i.test(hostOverride)) {
|
||||
const ov = new URL(hostOverride);
|
||||
u.protocol = ov.protocol;
|
||||
u.host = ov.host;
|
||||
return u.toString();
|
||||
}
|
||||
|
||||
u.hostname = hostOverride;
|
||||
return u.toString();
|
||||
} catch {
|
||||
return rawUrl;
|
||||
}
|
||||
};
|
||||
|
||||
const parseStoragePath = (fileUrl: string) => {
|
||||
try {
|
||||
const url = new URL(fileUrl);
|
||||
@@ -51,27 +71,22 @@ export async function GET(request: Request) {
|
||||
|
||||
const { bucket, path } = parsed;
|
||||
|
||||
const { data, error } = await supabaseAdmin.storage
|
||||
.from(bucket)
|
||||
.createSignedUrl(path, 60 * 60, { download: fileName });
|
||||
// OnlyOffice 需要“可被文档服务器拉取”的 URL:不要强制 download(Content-Disposition: attachment)。
|
||||
const { data, error } = forOnlyOffice
|
||||
? await supabaseAdmin.storage.from(bucket).createSignedUrl(path, 60 * 60)
|
||||
: await supabaseAdmin.storage.from(bucket).createSignedUrl(path, 60 * 60, { download: fileName });
|
||||
|
||||
if (error || !data?.signedUrl) {
|
||||
return NextResponse.json({ error: error?.message ?? "生成签名 URL 失败" }, { status: 500 });
|
||||
}
|
||||
|
||||
let signedUrl = data.signedUrl;
|
||||
if (
|
||||
forOnlyOffice &&
|
||||
hostOverride &&
|
||||
(signedUrl.includes("127.0.0.1") || signedUrl.includes("localhost"))
|
||||
) {
|
||||
try {
|
||||
const url = new URL(signedUrl);
|
||||
url.hostname = hostOverride;
|
||||
signedUrl = url.toString();
|
||||
} catch {
|
||||
// ignore parse errors
|
||||
}
|
||||
if (forOnlyOffice && hostOverride) {
|
||||
// 优先按 OnlyOffice 专用回源地址改写(可设置为 http://host.docker.internal:18000 以降低延迟)
|
||||
signedUrl = applyHostOverride(signedUrl, hostOverride);
|
||||
} else {
|
||||
// 返回给浏览器的 URL 必须是公网可达的(不能是 127.0.0.1:18000)
|
||||
signedUrl = rewriteToPublicOrigin(signedUrl, process.env.NEXT_PUBLIC_SUPABASE_URL);
|
||||
}
|
||||
|
||||
return NextResponse.json({ signedUrl });
|
||||
|
||||
Reference in New Issue
Block a user