59 lines
1.5 KiB
JavaScript
Raw Permalink Normal View History

2025-12-04 10:04:21 +08:00
// 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 ''
}
})()
/**
* 上传图片文件返回一个可直接用于 <img> 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 }
}