// app/composables/useUpload.js // 统一图片上传:POST /upload-image -> { url: "..." } import { useRuntimeConfig } from '#app' export function useUpload() { const { public: { apiBase }, } = useRuntimeConfig() // 计算后端基础域名(去掉 /api 之类的前缀) const apiOrigin = (() => { try { const u = new URL(apiBase, window.location.origin) // 如果 apiBase 以 /api 结尾,去掉这一段,只保留协议+域名+端口 if (u.pathname.endsWith('/api') || u.pathname.endsWith('/api/')) { u.pathname = u.pathname.replace(/\/api\/?$/, '') } else if (u.pathname !== '/' && u.pathname.endsWith('/')) { u.pathname = u.pathname.slice(0, -1) } return u.origin } catch { return '' } })() /** * 上传图片文件,返回一个可直接用于 的 URL 字符串 */ const uploadImage = async (file) => { if (!file) throw new Error('No file to upload') const fd = new FormData() fd.append('file', file) const res = await $fetch(`${apiBase}/upload-image`, { method: 'POST', body: fd, }) let url = res?.url || res?.URL if (!url || typeof url !== 'string') { console.error('[useUpload] invalid upload response:', res) throw new Error('Upload response missing url') } // 如果是相对路径(/static/...),补成后端完整地址 if (url.startsWith('/')) { if (apiOrigin) { url = apiOrigin + url } } return url } return { uploadImage } }