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