import { LoaderFunctionArgs } from "@remix-run/node"; import { postgrestGet } from "~/api/postgrest-client"; /** * 文档下载路由 - 处理文档下载请求 * 通过重定向到带有授权的连接来允许下载文件 */ export async function loader({ request }: LoaderFunctionArgs) { try { // 获取文件路径参数 const url = new URL(request.url); const filePath = url.searchParams.get("path"); if (!filePath) { return new Response("缺少文件路径参数", { status: 400 }); } // 调用Minio API获取带有授权的预签名URL // 这里假设后端有一个生成预签名URL的API const response = await postgrestGet<{ presignedUrl: string }>( '/minio/presign', { filter: { 'object_path': `eq.${filePath}`, 'expires_in': 'eq.300' // 5分钟有效期 } } ); if (response.error) { console.error("获取文件下载链接失败:", response.error); return new Response("获取文件下载链接失败", { status: 500 }); } if (!response.data?.presignedUrl) { return new Response("无法获取文件下载链接", { status: 404 }); } // 重定向到预签名URL,这样浏览器就能直接下载文件 return Response.redirect(response.data.presignedUrl); } catch (error) { console.error("文件下载处理失败:", error); return new Response( "文件下载处理失败: " + (error instanceof Error ? error.message : "未知错误"), { status: 500 } ); } }