2025-12-04 10:04:21 +08:00

59 lines
1.5 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 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 }
}