import { getUploadCredential, confirmUpload } from '@/api/ossUpload' /** * OSS 直传(与小程序 / 管理端一致) * @param {File} file * @param {string} type annexpic | attendancepic 等 * @returns {Promise<{name:string,fileId:string,url:string,objectKey?:string,uploadRecordId?:string}>} */ export function ossUploadFile(file, type = 'annexpic') { return getUploadCredential(type).then(res => { const credential = res.data let ext = '' const dotIndex = file.name.lastIndexOf('.') if (dotIndex > -1) { ext = file.name.substring(dotIndex) } const objectKey = credential.objectKeyPrefix + credential.fileId + ext return new Promise((resolve, reject) => { const formData = new FormData() formData.append('key', objectKey) formData.append('OSSAccessKeyId', credential.accessKeyId) formData.append('policy', credential.policy) formData.append('Signature', credential.signature) formData.append('success_action_status', '200') formData.append('file', file) const xhr = new XMLHttpRequest() xhr.open('POST', credential.host, true) xhr.onload = () => { if (xhr.status === 200) { confirmUpload({ objectKey, originalFileName: file.name, type }) .then(confirmRes => resolve(confirmRes.data)) .catch(reject) } else { reject(new Error('OSS 上传失败,状态码:' + xhr.status)) } } xhr.onerror = () => reject(new Error('OSS 上传网络错误')) xhr.send(formData) }) }) }