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.
 
 
 
 
 
 

390 lines
11 KiB

import request from "./request.js";
const qiniuUploader = require("./qiniuUploader");
export default class fileUpload extends request {
constructor(props) {
// 调用实现父类的构造函数
super(props);
}
//七牛云上传图片
qnImgUpload(data = {}, options = {}) {
const _this = this;
return new Promise((resolve, reject) => {
uni.chooseImage({
count: data.count || 9, //默认9
sizeType: data.sizeType || ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
sourceType: data.sourceType || ['album', 'camera'], //从相册选择
success: function(res) {
_this.qnFileUpload({
files: res.tempFiles,
...data
}, options).then(resolve, reject);
}
});
});
}
//七牛云上传文件命名
randomChar(l, url = "") {
const x = "0123456789qwertyuioplkjhgfdsazxcvbnm";
let tmp = "";
let time = new Date();
for (let i = 0; i < l; i++) {
tmp += x.charAt(Math.ceil(Math.random() * 100000000) % x.length);
}
return (
"file/" +
url +
time.getTime() +
tmp
);
}
//七牛云文件上传(支持多张上传)
qnFileUpload(data = {}, options = {}) {
const _this = this;
let requestInfo = {
...data,
...this.config,
...options,
header: {},
method: "FILE"
};
return new Promise((resolve, reject) => {
//请求前回调
if (_this.requestStart) {
let requestStart = _this.requestStart(requestInfo);
if (typeof requestStart == "object") {
requestInfo.load = requestStart.load;
requestInfo.files = requestStart.files;
} else {
//请求完成回调
_this.requestEnd && _this.requestEnd(requestInfo, {
errMsg: "请求开始拦截器未通过",
statusCode: 0
});
reject({
errMsg: "请求开始拦截器未通过",
statusCode: 0
});
return;
}
}
if (Array.isArray(requestInfo.files)) {
let len = requestInfo.files.length;
let imageList = new Array;
if(_this.getQnToken){
_this.getQnToken(qnRes => {
/*
*接口返回参数:
*visitPrefix:访问文件的域名
*token:七牛云上传token
*folderPath:上传的文件夹
*region: 地区 默认为:SCN
*/
uploadFile(0);
function uploadFile(i) {
let fileData = {
fileIndex: i,
files: requestInfo.files,
size: requestInfo.files[i].size
};
// #ifdef H5
fileData.name = requestInfo.files[i].name;
fileData.type = requestInfo.files[i].type;
// #endif
// 交给七牛上传
qiniuUploader.upload(requestInfo.files[i].path, (res) => {
fileData.url = res.imageURL;
requestInfo.onEachUpdate && requestInfo.onEachUpdate({
url: res.imageURL,
...fileData
});
imageList.push(res.imageURL);
if (len - 1 > i) {
uploadFile(i + 1);
} else {
//请求完成回调
_this.requestEnd && _this.requestEnd(requestInfo, {
errMsg: "request:ok",
statusCode: 200,
data: imageList
});
resolve(imageList);
}
}, (error) => {
console.log('error: ' + error);
//请求完成回调
_this.requestEnd && _this.requestEnd(requestInfo, error);
reject(error)
}, {
region: qnRes.region || 'SCN', //地区
domain: qnRes.visitPrefix, // bucket 域名,下载资源时用到。
key: _this.randomChar(8, qnRes.folderPath),
uptoken: qnRes.token, // 由其他程序生成七牛 uptoken
uptokenURL: 'UpTokenURL.com/uptoken' // 上传地址
}, (res) => {
console.log(requestInfo);
requestInfo.onProgressUpdate && requestInfo.onProgressUpdate(Object.assign({}, fileData, res));
// console.log('上传进度', res.progress)
// console.log('已经上传的数据长度', res.totalBytesSent)
// console.log('预期需要上传的数据总长度', res.totalBytesExpectedToSend)
});
}
});
} else {
//请求完成回调
_this.requestEnd && _this.requestEnd(requestInfo, {
errMsg: "请添加七牛云回调方法:getQnToken",
statusCode: 0
});
reject({
errMsg: "请添加七牛云回调方法:getQnToken",
statusCode: 0
});
return;
}
} else {
//请求完成回调
_this.requestEnd && _this.requestEnd(requestInfo, {
errMsg: "files 必须是数组类型",
statusCode: 0
});
reject({
errMsg: "files 必须是数组类型",
statusCode: 0
});
};
});
}
//本地服务器图片上传
urlImgUpload(url = '', data = {}, options = {}) {
const _this = this;
return new Promise((resolve, reject) => {
uni.chooseImage({
count: data.count || 9, //默认9
sizeType: data.sizeType || ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
sourceType: data.sourceType || ['album', 'camera'], //从相册选择
success: function(res) {
_this.urlFileUpload(url, {
...data,
files: res.tempFiles
}, options).then(resolve, reject);
}
});
});
}
//本地服务器文件上传方法
urlFileUpload(url = '', data = {}, options = {}) {
let requestInfo = this.getDefault({
...data,
url: url,
method: "FILE"
}, options);
const _this = this;
return new Promise((resolve, reject) => {
//请求前回调
if (_this.requestStart) {
let requestStart = _this.requestStart(requestInfo);
if (typeof requestStart == "object") {
requestInfo.data = requestStart.data;
requestInfo.header = requestStart.header;
requestInfo.isPrompt = requestStart.isPrompt;
requestInfo.load = requestStart.load;
requestInfo.isFactory = requestStart.isFactory;
requestInfo.files = requestStart.files;
} else {
//请求完成回调
_this.requestEnd && _this.requestEnd(requestInfo, {
errMsg: "请求开始拦截器未通过",
statusCode: 0
});
reject({
errMsg: "请求开始拦截器未通过",
statusCode: 0
});
return;
}
}
// 本地文件上传去掉默认Content-Type
if(requestInfo.header['Content-Type']){
delete requestInfo.header['Content-Type'];
}
if (Array.isArray(requestInfo.files)) {
// #ifdef APP-PLUS || H5
let files = [];
let fileData = {
files: requestInfo.files,
name: requestInfo.name || "file"
};
requestInfo.files.forEach(item => {
files.push({
uri: item.path,
name: requestInfo.name || "file"
});
});
let config = {
url: requestInfo.url,
files: files,
header: requestInfo.header, //加入请求头
success: (response) => {
if (typeof(response.data) == "string") {
response.data = JSON.parse(response.data);
}
//是否用外部的数据处理方法
if (requestInfo.isFactory && _this.dataFactory) {
//数据处理
_this.dataFactory({
...requestInfo,
response: response,
resolve: function(data) {
requestInfo.onEachUpdate && requestInfo.onEachUpdate({
data: data,
...fileData
});
//请求完成回调
_this.requestEnd && _this.requestEnd(requestInfo, {
errMsg: "request:ok",
statusCode: 200,
data: data
});
resolve(data);
},
reject: function(err) {
//请求完成回调
_this.requestEnd && _this.requestEnd(requestInfo, {
errMsg: "数据工厂返回错误",
statusCode: 0,
data: err
});
reject(err);
}
});
} else {
requestInfo.onEachUpdate && requestInfo.onEachUpdate({
data: response,
...fileData
});
//请求完成回调
_this.requestEnd && _this.requestEnd(requestInfo, response);
resolve(response);
}
},
fail: (err) => {
//请求完成回调
_this.requestEnd && _this.requestEnd(requestInfo, err);
reject(err);
}
};
if (requestInfo.data) {
config.formData = requestInfo.data;
}
const uploadTask = uni.uploadFile(config);
uploadTask.onProgressUpdate(res => {
requestInfo.onProgressUpdate && requestInfo.onProgressUpdate(Object.assign({}, fileData, res));
});
// #endif
// #ifdef MP
const len = requestInfo.files.length - 1;
let fileList = new Array;
fileUpload(0);
function fileUpload(i) {
let fileData = {
fileIndex: i,
files: requestInfo.files,
size: requestInfo.files[i].size
};
// #ifdef H5
fileData.name = requestInfo.files[i].name;
fileData.type = requestInfo.files[i].type;
// #endif
let config = {
url: requestInfo.url,
filePath: requestInfo.files[i].path,
header: requestInfo.header, //加入请求头
name: requestInfo.name || "file",
success: (response) => {
if (typeof(response.data) == "string") {
response.data = JSON.parse(response.data);
}
//是否用外部的数据处理方法
if (requestInfo.isFactory && _this.dataFactory) {
//数据处理
_this.dataFactory({
...requestInfo,
response: response,
resolve: function(data) {
requestInfo.onEachUpdate && requestInfo.onEachUpdate({
data: data,
...fileData
});
fileList.push(data);
if (len <= i) {
//请求完成回调
_this.requestEnd && _this.requestEnd(requestInfo, {
errMsg: "request:ok",
statusCode: 200,
data: fileList
});
resolve(fileList);
} else {
fileUpload(i + 1);
}
},
reject: function(err) {
//请求完成回调
_this.requestEnd && _this.requestEnd(requestInfo, {
errMsg: "数据工厂返回错误",
statusCode: 0,
data: err
});
reject(err);
}
});
} else {
requestInfo.onEachUpdate && requestInfo.onEachUpdate({
data: response,
...fileData
});
fileList.push(response);
if (len <= i) {
//请求完成回调
_this.requestEnd && _this.requestEnd(requestInfo, {
errMsg: "request:ok",
statusCode: 200,
data: fileList
});
resolve(fileList);
} else {
fileUpload(i + 1);
}
}
},
fail: (err) => {
//请求完成回调
_this.requestEnd && _this.requestEnd(requestInfo, err);
reject(err);
}
};
if (requestInfo.data) {
config.formData = requestInfo.data;
}
const uploadTask = uni.uploadFile(config);
uploadTask.onProgressUpdate(res => {
requestInfo.onProgressUpdate && requestInfo.onProgressUpdate(Object.assign({}, fileData, res));
});
}
// #endif
} else {
//请求完成回调
_this.requestEnd && _this.requestEnd(requestInfo, {
errMsg: "files 必须是数组类型",
statusCode: 0
});
reject({
errMsg: "files 必须是数组类型",
statusCode: 0
})
}
});
}
}