utils.js 7.7 KB

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