import { $fetch } from 'ofetch' import { createError, defineEventHandler, getHeader, readRawBody } from 'h3' import { useRuntimeConfig } from '#imports' import { getTenantFromContext } from '../../utils/tenant' /** * 资质证件上传(注册页与资质页共用) * POST /api/tender/upload (multipart/form-data, 字段名 file) * 代理到 mp-api /api/hjc/auth/upload(匿名放行,登录前后均可用)。 * * 说明:与 h5 一致走「证件上传」链路;该接口不写 file_record 表, * 上传结果以 URL 存在 hjc_enterprise_material.file_url。 */ export default defineEventHandler(async (event) => { const config = useRuntimeConfig() const ctx = getTenantFromContext(event, config) const contentType = getHeader(event, 'content-type') || '' if (!contentType.includes('multipart/form-data')) { throw createError({ statusCode: 400, statusMessage: 'Content-Type must be multipart/form-data' }) } // 原样转发 multipart 原始字节(含 boundary),避免丢失文件流 const raw = await readRawBody(event, false) if (!raw) { throw createError({ statusCode: 400, statusMessage: '上传文件为空' }) } try { const res = await $fetch('/hjc/auth/upload', { baseURL: config.public.modulesApiBase, method: 'POST', headers: { TenantId: ctx.tenantId, 'Content-Type': contentType }, query: { TenantId: ctx.tenantId }, body: raw }) as any return res && res.data !== undefined ? res.data : res } catch (error: any) { throw createError({ statusCode: error?.statusCode || error?.response?.status || 502, statusMessage: error?.data?.message || error?.statusMessage || '上传失败' }) } })