import request from '../request.js' import common from "../common.js" import CosAuth from "../auth/ext/cos-auth.min.js" let file = {} /** * OSS服务端签名后直传(支持多个文件) * @param {array} tempFiles 图片的本地文件列表,每一项是一个 File 对象 * @param {array} array 已经上传成功的图片 * @param {object} ossConfig OSS服务端签名 * @param {boolean} isOriginalName false--随机文件名 true--原文件名 * @param {string} fileType 文件类型,image/video/audio仅支付宝小程序,且必填。 * @date 2022-12-09 */ file.uploadFilesToOss = function(tempFiles, array = [], ossConfig = {}, isOriginalName = false, fileType = 'image') { return new Promise((resolve, reject) => { // 如果没有ossConfig配置,获取配置 if (!ossConfig.dir) { request.getData('base/oss/api/Upload/getOssSignature').then(res => { let ossConfig = res.data // 重新调用方法 this.uploadFilesToOss(tempFiles, array, ossConfig, isOriginalName, fileType).then( res => { resolve(res) }).catch(err => { reject(err) }) }) } else { // 图片的本地文件列表为空,返回现有的图片数组 if (tempFiles.length <= 0) { console.log('--上传完成--', array) resolve(array) // 有待上传的图片的本地文件列表 } else { // 取出队列第一个元素 let tempFile = tempFiles.shift() // 组合formData let formData = { key: ossConfig.dir + tempFile.fileName, policy: ossConfig.policy, OSSAccessKeyId: ossConfig.accessid, // 让服务端返回200,不然,默认会返回204 success_action_status: '200', signature: ossConfig.signature, } // 上传文件 this.uploadFile(ossConfig.host, tempFile.path, formData, {}, fileType).then(res => { // 上传成功 if (res.statusCode == 200) { // MP4文件,获取第一帧截屏当封面 if (common.getSuffix(tempFile.fileName) == '.mp4' || common.getSuffix( tempFile.fileName) == '.MP4') { request.getData('base/file/api/Upload/getVideoScreenshot', { video_url: ossConfig.show_host + '/' + ossConfig.dir + tempFile.fileName }).then(res => { let arr = { video_url: ossConfig.show_host + '/' + ossConfig.dir + tempFile.fileName, image_url: res.data.image_url } array.push(arr) this.uploadFilesToOss(tempFiles, array, ossConfig, isOriginalName).then(res => { resolve(res) }).catch(err => { reject(err) }) }) // 其他类型文件 } else { array.push(ossConfig.show_host + '/' + ossConfig.dir + tempFile .fileName) // 重新调用方法 this.uploadFilesToOss(tempFiles, array, ossConfig, isOriginalName, fileType).then(res => { resolve(res) }).catch(err => { reject(err) }) } } else { reject('上传失败,接口报错') } }).catch(err => { reject('上传失败,接口报错') }) } } }) } /** * COS服务端签名后直传(支持多个文件) * @param {array} tempFiles 图片的本地文件列表,每一项是一个 File 对象 * @param {array} array 已经上传成功的图片 * @param {object} cosConfig COS服务端签名 * @param {boolean} isOriginalName false--随机文件名 true--原文件名 * @param {string} fileType 文件类型,image/video/audio仅支付宝小程序,且必填。 * @date 2022-12-09 */ file.uploadFilesToCos = function(tempFiles, array = [], cosConfig = {}, isOriginalName = false, fileType = 'image') { return new Promise((resolve, reject) => { // 如果没有ossConfig配置,获取配置 if (!cosConfig.dir) { request.getData('base/cos/api/Upload/getCosParam', { is_original_name: false }).then(res => { let cosConfig = res.data // 重新调用方法 this.uploadFilesToCos(tempFiles, array, cosConfig, isOriginalName, fileType).then( res => { resolve(res) }).catch(err => { reject(err) }) }) } else { // 图片的本地文件列表为空,返回现有的图片数组 if (tempFiles.length <= 0) { console.log('--上传完成--', array) resolve(array) // 有待上传的图片的本地文件列表 } else { // 取出队列第一个元素 let tempFile = tempFiles.shift() // 组合formData let formData = { 'key': cosConfig.dir + '/' + tempFile.fileName, "success_action_status": 200, // 'success_action_redirect': form_data.policy, // 'OSSAccessKeyId': form_data.accessid, 'Signature': CosAuth({ SecretId: cosConfig.tem_secret_id, SecretKey: cosConfig.tem_secret_key, Method: 'POST', Pathname: '/', }), 'x-cos-security-token': cosConfig.token, 'Content-Type': '', } // 上传文件 this.uploadFile(cosConfig.host, tempFile.path, formData, {}, fileType).then(res => { // 上传成功 if (res.statusCode == 200) { // MP4文件,获取第一帧截屏当封面 if (common.getSuffix(tempFile.fileName) == '.mp4' || common.getSuffix( tempFile.fileName) == '.MP4') { request.getData('base/file/api/Upload/getVideoScreenshot', { video_url: cosConfig.show_url + '/' + cosConfig.dir + '/' + tempFile.fileName }).then(res => { let arr = { video_url: cosConfig.show_url + '/' + cosConfig.dir + tempFile.fileName, image_url: res.data.image_url } array.push(arr) this.uploadFilesToCos(tempFiles, array, cosConfig, isOriginalName).then(res => { resolve(res) }).catch(err => { reject(err) }) }) // 其他类型文件 } else { array.push(cosConfig.show_url + '/' + cosConfig.dir + '/' + tempFile .fileName) // 重新调用方法 this.uploadFilesToCos(tempFiles, array, cosConfig, isOriginalName, fileType).then(res => { resolve(res) }).catch(err => { reject(err) }) } } else { reject('上传失败,接口报错') } }).catch(err => { reject('上传失败,接口报错') }) } } }) } /** * 将本地资源上传到服务器 * @param {string} url 开发者服务器 url * @param {string} filePath 要上传文件资源的路径 * @param {object} formData HTTP 请求中其他额外的 form data * @param {object} header HTTP 请求 Header, header 中不能设置 Referer * @param {string} fileType 文件类型,image/video/audio【支付宝小程序必填】 * @date 2022-12-09 */ file.uploadFile = function(url, filePath, formData = {}, header = {}, fileType = 'image') { return new Promise((resolve, reject) => { uni.uploadFile({ // 开发者服务器 url【必填】 url: url, // #ifdef MP-ALIPAY // 文件类型,image/video/audio【支付宝小程序必填】 fileType: fileType, // #endif // 要上传文件资源的路径【必填】 filePath: filePath, // 文件对应的 key , 开发者在服务器端通过这个 key 可以获取到文件二进制内容【必填】 name: 'file', // HTTP 请求 Header, header 中不能设置 Referer header: header, // HTTP 请求中其他额外的 form data formData: formData, success: (res) => { // console.log('上传文件成功', res) resolve(res) }, fail: (err) => { console.log('上传文件失败', err) reject(err) } }) }) } /** * 文件上传到服务器(支持多个文件 暂时没有用) * @param {array} tempFiles 图片的本地文件列表,每一项是一个 File 对象 * @param {array} array 已经上传成功的图片 * @param {boolean} isOriginalName false--随机文件名 true--原文件名 * @param {string} fileType 文件类型,image/video/audio仅支付宝小程序,且必填。 * 2021-03-01 */ // file.uploadToServer = function(tempFiles, array = [], isOriginalName = false, fileType = 'image') { // return new Promise((resolve, reject) => { // let requestUrl = config.isTest ? config.testHost + config.testEntry : config.host + config.entry // let uid // if (this.user_agent == 'h5' || this.user_agent == 'weixin') { // uid = uni.getStorageSync('uid') ? uni.getStorageSync('uid') : 2 // } else { // uid = config.uid // } // if (tempFiles.length > 0) { // let tempFile = tempFiles.shift(); //取出队列第一个元素 // uni.uploadFile({ // url: requestUrl + 'base/file/api/Upload/fileUpload', //仅为示例,非真实的接口地址 // filePath: tempFile.path, // // #ifdef MP-ALIPAY // fileType: fileType, // // #endif // name: 'file', // header: { // 'content-type': 'application/x-www-form-urlencoded', // 'access-token': uni.getStorageSync('access_token'), // 'code-agent': common.userAgent(), // 'uid': uid // }, // // dataType: 'json', // success: (res) => { // res = JSON.parse(res.data) // if (res.code == 0) { // if (common.getSuffix(tempFile.file_name) == '.mp4') { //MP4文件获取第一帧截屏当封面 // request.getData('base/file/api/Upload/getVideoScreenshot', { // video_url: res.data.url // }).then(res1 => { // let arr = { // video_url: res.data.url, // image_url: res1.data.image_url // } // array.push(arr); // this.upload(tempFiles, array, isOriginalName) // .then(res => { // resolve(res); // }, res => { // reject(res); // }); // }) // } else { //其他类型文件 // array.push(res.data.url) // this.uploadToServer(tempFiles, array, isOriginalName).then(res => { // resolve(res); // }, res => { // reject(res); // }); // } // } else { // reject('上传失败,接口报错'); // } // }, // fail: (res) => { // reject(res); // } // }); // } else { // resolve(array); // } // }) // } export default file