oss-upload.js 1.58 KB
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)
    })
  })
}