utils.js 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. const qiniuUploader = require("./qiniuUploader");
  2. //七牛云上传文件命名
  3. export const randomChar = function(l, url = "") {
  4. const x = "0123456789qwertyuioplkjhgfdsazxcvbnm";
  5. let tmp = "";
  6. let time = new Date();
  7. for (let i = 0; i < l; i++) {
  8. tmp += x.charAt(Math.ceil(Math.random() * 100000000) % x.length);
  9. }
  10. return (
  11. "file/" +
  12. url +
  13. time.getTime() +
  14. tmp
  15. );
  16. }
  17. //图片选择
  18. export const chooseImage = function(data) {
  19. return new Promise((resolve, reject) => {
  20. uni.chooseImage({
  21. count: data.count || 9, //默认9
  22. sizeType: data.sizeType || ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
  23. sourceType: data.sourceType || ['album', 'camera'], //从相册选择
  24. success: function(res) {
  25. resolve(res.tempFiles);
  26. },
  27. fail: err => {
  28. reject({
  29. errMsg: err.errMsg,
  30. errCode: err.errCode,
  31. statusCode: 0,
  32. });
  33. }
  34. });
  35. });
  36. }
  37. //视频选择
  38. export const chooseVideo = function(data) {
  39. return new Promise((resolve, reject) => {
  40. uni.chooseVideo({
  41. sourceType: data.sourceType || ['album', 'camera'], //从相册选择
  42. compressed: data.compressed || false, //是否压缩所选的视频源文件,默认值为 true,需要压缩。
  43. maxDuration: data.maxDuration || 60, //拍摄视频最长拍摄时间,单位秒。最长支持 60 秒。
  44. camera: data.camera || 'back', //'front'、'back',默认'back'
  45. success: function(res) {
  46. let files = [{
  47. path: res.tempFilePath
  48. }];
  49. // #ifdef APP-PLUS || H5 || MP-WEIXIN
  50. files[0].duration = res.duration;
  51. files[0].size = res.size;
  52. files[0].height = res.height;
  53. files[0].width = res.width;
  54. // #endif
  55. // #ifdef H5
  56. files[0].name = res.name;
  57. // #endif
  58. resolve(files);
  59. },
  60. fail: err => {
  61. reject({
  62. errMsg: err.errMsg,
  63. errCode: err.errCode,
  64. statusCode: 0,
  65. });
  66. }
  67. });
  68. });
  69. }
  70. // 七牛云上传
  71. export const qiniuUpload = function(requestInfo, getQnToken) {
  72. return new Promise((resolve, reject) => {
  73. if (Array.isArray(requestInfo.files)) {
  74. let len = requestInfo.files.length;
  75. let fileList = new Array;
  76. if (getQnToken) {
  77. getQnToken(qnRes => {
  78. /*
  79. *接口返回参数:
  80. *visitPrefix:访问文件的域名
  81. *token:七牛云上传token
  82. *folderPath:上传的文件夹
  83. *region: 地区 默认为:SCN
  84. */
  85. let prefixLen = qnRes.visitPrefix.length;
  86. if(qnRes.visitPrefix.charAt(prefixLen - 1) == '/'){
  87. qnRes.visitPrefix = qnRes.visitPrefix.substring(0, prefixLen - 1)
  88. }
  89. uploadFile(0);
  90. function uploadFile(i) {
  91. let item = requestInfo.files[i];
  92. let updateUrl = randomChar(10, qnRes.folderPath);
  93. let fileData = {
  94. fileIndex: i,
  95. files: requestInfo.files,
  96. ...item
  97. };
  98. if (item.name) {
  99. fileData.name = item.name;
  100. let nameArr = item.name.split(".");
  101. updateUrl += "." + nameArr[nameArr.length - 1];
  102. }
  103. // 交给七牛上传
  104. qiniuUploader.upload(item.path || item, (res) => {
  105. fileData.url = res.imageURL;
  106. requestInfo.onEachUpdate && requestInfo.onEachUpdate({
  107. url: res.imageURL,
  108. ...fileData
  109. });
  110. fileList.push(res.imageURL);
  111. if (len - 1 > i) {
  112. uploadFile(i + 1);
  113. } else {
  114. resolve(fileList);
  115. }
  116. }, (error) => {
  117. reject(error);
  118. }, {
  119. region: qnRes.region || 'SCN', //地区
  120. domain: qnRes.visitPrefix, // bucket 域名,下载资源时用到。
  121. key: updateUrl,
  122. uptoken: qnRes.token, // 由其他程序生成七牛 uptoken
  123. uptokenURL: 'UpTokenURL.com/uptoken' // 上传地址
  124. }, (res) => {
  125. console.log(requestInfo);
  126. requestInfo.onProgressUpdate && requestInfo.onProgressUpdate(Object.assign({}, fileData, res));
  127. // console.log('上传进度', res.progress)
  128. // console.log('已经上传的数据长度', res.totalBytesSent)
  129. // console.log('预期需要上传的数据总长度', res.totalBytesExpectedToSend)
  130. });
  131. }
  132. });
  133. } else {
  134. reject({
  135. errMsg: "请添加七牛云回调方法:getQnToken",
  136. statusCode: 0
  137. });
  138. }
  139. } else {
  140. reject({
  141. errMsg: "files 必须是数组类型",
  142. statusCode: 0
  143. });
  144. };
  145. });
  146. }
  147. // 服务器URL上传
  148. export const urlUpload = function(requestInfo, dataFactory) {
  149. return new Promise((resolve, reject) => {
  150. // 本地文件上传去掉默认Content-Type
  151. if (requestInfo.header['Content-Type']) {
  152. delete requestInfo.header['Content-Type'];
  153. }
  154. // 本地文件上传去掉默认Content-Type
  155. if (requestInfo.header['content-type']) {
  156. delete requestInfo.header['content-type'];
  157. }
  158. if (Array.isArray(requestInfo.files)) {
  159. // // #ifdef APP-PLUS || H5
  160. // let files = [];
  161. // let fileData = {
  162. // files: requestInfo.files,
  163. // name: requestInfo.name || "file"
  164. // };
  165. // requestInfo.files.forEach(item => {
  166. // let fileInfo = {
  167. // name: requestInfo.name || "file",
  168. // };
  169. // if(item.path){
  170. // fileInfo.uri = item.path;
  171. // } else {
  172. // fileInfo.file = item;
  173. // }
  174. // files.push(fileInfo);
  175. // });
  176. // let config = {
  177. // url: requestInfo.url,
  178. // files: files,
  179. // header: requestInfo.header, //加入请求头
  180. // success: (response) => {
  181. // //是否用外部的数据处理方法
  182. // if (requestInfo.isFactory && dataFactory) {
  183. // //数据处理
  184. // dataFactory({
  185. // ...requestInfo,
  186. // response: response,
  187. // }).then(data => {
  188. // requestInfo.onEachUpdate && requestInfo.onEachUpdate({
  189. // data: data,
  190. // ...fileData
  191. // });
  192. // resolve(data);
  193. // },err => {
  194. // reject(err);
  195. // });
  196. // } else {
  197. // requestInfo.onEachUpdate && requestInfo.onEachUpdate({
  198. // data: response,
  199. // ...fileData
  200. // });
  201. // resolve(response);
  202. // }
  203. // },
  204. // fail: (err) => {
  205. // reject(err);
  206. // }
  207. // };
  208. // if (requestInfo.data) {
  209. // config.formData = requestInfo.data;
  210. // }
  211. // const uploadTask = uni.uploadFile(config);
  212. // uploadTask.onProgressUpdate(res => {
  213. // requestInfo.onProgressUpdate && requestInfo.onProgressUpdate(Object.assign({}, fileData, res));
  214. // });
  215. // // #endif
  216. // #-ifdef MP
  217. const len = requestInfo.files.length - 1;
  218. let fileList = new Array;
  219. fileUpload(0);
  220. function fileUpload(i) {
  221. let item = requestInfo.files[i];
  222. let fileData = {
  223. fileIndex: i,
  224. files: requestInfo.files,
  225. ...item
  226. };
  227. let config = {
  228. url: requestInfo.url,
  229. filePath: item.path,
  230. header: requestInfo.header, //加入请求头
  231. name: requestInfo.name || "file",
  232. success: (response) => {
  233. //是否用外部的数据处理方法
  234. if (requestInfo.isFactory && dataFactory) {
  235. //数据处理
  236. dataFactory({
  237. ...requestInfo,
  238. response: response,
  239. }).then(data => {
  240. fileList.push(data);
  241. requestInfo.onEachUpdate && requestInfo.onEachUpdate({
  242. data: data,
  243. ...fileData
  244. });
  245. if (len <= i) {
  246. resolve(fileList);
  247. } else {
  248. fileUpload(i + 1);
  249. }
  250. },err => {
  251. reject(err);
  252. });
  253. } else {
  254. requestInfo.onEachUpdate && requestInfo.onEachUpdate({
  255. data: response,
  256. ...fileData
  257. });
  258. fileList.push(response);
  259. if (len <= i) {
  260. resolve(fileList);
  261. } else {
  262. fileUpload(i + 1);
  263. }
  264. }
  265. },
  266. fail: (err) => {
  267. reject(err);
  268. }
  269. };
  270. if (requestInfo.data) {
  271. config.formData = requestInfo.data;
  272. }
  273. const uploadTask = uni.uploadFile(config);
  274. uploadTask.onProgressUpdate(res => {
  275. requestInfo.onProgressUpdate && requestInfo.onProgressUpdate(Object.assign({}, fileData, res));
  276. });
  277. }
  278. // #-endif
  279. } else {
  280. reject({
  281. errMsg: "files 必须是数组类型",
  282. statusCode: 0
  283. });
  284. }
  285. });
  286. }