const qiniuUploader = require("./qiniuUploader"); //七牛云上传文件命名 export const randomChar = function(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 ); } //图片选择 export const chooseImage = function(data) { 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) { resolve(res.tempFiles); }, fail: err => { reject({ errMsg: err.errMsg, errCode: err.errCode, statusCode: 0, }); } }); }); } //视频选择 export const chooseVideo = function(data) { return new Promise((resolve, reject) => { uni.chooseVideo({ sourceType: data.sourceType || ['album', 'camera'], //从相册选择 compressed: data.compressed || false, //是否压缩所选的视频源文件,默认值为 true,需要压缩。 maxDuration: data.maxDuration || 60, //拍摄视频最长拍摄时间,单位秒。最长支持 60 秒。 camera: data.camera || 'back', //'front'、'back',默认'back' success: function(res) { let files = [{ path: res.tempFilePath }]; // #ifdef APP-PLUS || H5 || MP-WEIXIN files[0].duration = res.duration; files[0].size = res.size; files[0].height = res.height; files[0].width = res.width; // #endif // #ifdef H5 files[0].name = res.name; // #endif resolve(files); }, fail: err => { reject({ errMsg: err.errMsg, errCode: err.errCode, statusCode: 0, }); } }); }); } // 七牛云上传 export const qiniuUpload = function(requestInfo, getQnToken) { return new Promise((resolve, reject) => { if (Array.isArray(requestInfo.files)) { let len = requestInfo.files.length; let fileList = new Array; if (getQnToken) { getQnToken(qnRes => { /* *接口返回参数: *visitPrefix:访问文件的域名 *token:七牛云上传token *folderPath:上传的文件夹 *region: 地区 默认为:SCN */ let prefixLen = qnRes.visitPrefix.length; if(qnRes.visitPrefix.charAt(prefixLen - 1) == '/'){ qnRes.visitPrefix = qnRes.visitPrefix.substring(0, prefixLen - 1) } uploadFile(0); function uploadFile(i) { let item = requestInfo.files[i]; let updateUrl = randomChar(10, qnRes.folderPath); let fileData = { fileIndex: i, files: requestInfo.files, ...item }; if (item.name) { fileData.name = item.name; let nameArr = item.name.split("."); updateUrl += "." + nameArr[nameArr.length - 1]; } // 交给七牛上传 qiniuUploader.upload(item.path || item, (res) => { fileData.url = res.imageURL; requestInfo.onEachUpdate && requestInfo.onEachUpdate({ url: res.imageURL, ...fileData }); fileList.push(res.imageURL); if (len - 1 > i) { uploadFile(i + 1); } else { resolve(fileList); } }, (error) => { reject(error); }, { region: qnRes.region || 'SCN', //地区 domain: qnRes.visitPrefix, // bucket 域名,下载资源时用到。 key: updateUrl, 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 { reject({ errMsg: "请添加七牛云回调方法:getQnToken", statusCode: 0 }); } } else { reject({ errMsg: "files 必须是数组类型", statusCode: 0 }); }; }); } // 服务器URL上传 export const urlUpload = function(requestInfo, dataFactory) { return new Promise((resolve, reject) => { // 本地文件上传去掉默认Content-Type if (requestInfo.header['Content-Type']) { delete requestInfo.header['Content-Type']; } // 本地文件上传去掉默认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 => { // let fileInfo = { // name: requestInfo.name || "file", // }; // if(item.path){ // fileInfo.uri = item.path; // } else { // fileInfo.file = item; // } // files.push(fileInfo); // }); // let config = { // url: requestInfo.url, // files: files, // header: requestInfo.header, //加入请求头 // success: (response) => { // //是否用外部的数据处理方法 // if (requestInfo.isFactory && dataFactory) { // //数据处理 // dataFactory({ // ...requestInfo, // response: response, // }).then(data => { // requestInfo.onEachUpdate && requestInfo.onEachUpdate({ // data: data, // ...fileData // }); // resolve(data); // },err => { // reject(err); // }); // } else { // requestInfo.onEachUpdate && requestInfo.onEachUpdate({ // data: response, // ...fileData // }); // resolve(response); // } // }, // fail: (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 item = requestInfo.files[i]; let fileData = { fileIndex: i, files: requestInfo.files, ...item }; let config = { url: requestInfo.url, filePath: item.path, header: requestInfo.header, //加入请求头 name: requestInfo.name || "file", success: (response) => { //是否用外部的数据处理方法 if (requestInfo.isFactory && dataFactory) { //数据处理 dataFactory({ ...requestInfo, response: response, }).then(data => { fileList.push(data); requestInfo.onEachUpdate && requestInfo.onEachUpdate({ data: data, ...fileData }); if (len <= i) { resolve(fileList); } else { fileUpload(i + 1); } },err => { reject(err); }); } else { requestInfo.onEachUpdate && requestInfo.onEachUpdate({ data: response, ...fileData }); fileList.push(response); if (len <= i) { resolve(fileList); } else { fileUpload(i + 1); } } }, fail: (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 { reject({ errMsg: "files 必须是数组类型", statusCode: 0 }); } }); }