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 }); } }); }