You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

331 lines
9.9 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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