utils.js 11 KB

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