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