oss-upload.js 1.8 KB
import { getUploadCredential, confirmUpload } from '@/api/extend/ossUpload'
import { appendOssImageThumb } from '@/utils/oss-image-thumb'

/**
 * OSS 直传文件
 * @param {File} file - File 对象
 * @param {string} type - 上传类型,默认 annexpic
 * @returns {Promise<{name: string, fileId: string, url: string, objectKey: string}>}
 */
export function ossUploadFile(file, type = 'annexpic') {
  return getUploadCredential(type).then(res => {
    var credential = res.data
    var ext = ''
    var dotIndex = file.name.lastIndexOf('.')
    if (dotIndex > -1) {
      ext = file.name.substring(dotIndex)
    }
    var objectKey = credential.objectKeyPrefix + credential.fileId + ext

    return new Promise(function(resolve, reject) {
      var 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)

      var xhr = new XMLHttpRequest()
      xhr.open('POST', credential.host, true)
      xhr.onload = function() {
        if (xhr.status === 200) {
          confirmUpload({
            objectKey: objectKey,
            originalFileName: file.name,
            type: type
          }).then(function(confirmRes) {
            var d = confirmRes.data
            if (d && d.url && !d.thumbnailUrl) {
              d.thumbnailUrl = appendOssImageThumb(d.url)
            }
            resolve(d)
          }).catch(reject)
        } else {
          reject(new Error('OSS 上传失败,状态码:' + xhr.status))
        }
      }
      xhr.onerror = function() {
        reject(new Error('OSS 上传网络错误'))
      }
      xhr.send(formData)
    })
  })
}