h5-uploader.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. let mask = document.querySelector(".mask");
  2. let fileDom = document.querySelector(".file");
  3. let tis = document.querySelector(".tis");
  4. let logoDom = document.querySelector(".logo");
  5. let progress = document.querySelector(".tis-progress");
  6. let cancel = document.querySelector(".cancel-btn");
  7. let createUpload = (file,{ url, key='file', header = {},data = {},addName,addSize}) => {
  8. console.log(`
  9. 上传地址:${url}\n
  10. 上传附件:${file.name} 附件大小:${file.size}\n
  11. 请求头:${JSON.stringify(header)}\n
  12. 业务参数:${JSON.stringify(data)}
  13. `);
  14. if (!url) {return;}
  15. tis.style.display = 'flex';
  16. let formData = new FormData();
  17. for (let keys in data) {formData.append(keys, data[keys]);}
  18. if (addName) {formData.append(addName, file.name);console.log('补充参数:',JSON.stringify({addName:file.name}));}
  19. if (addSize) {formData.append(addSize, file.size);console.log('补充参数:',JSON.stringify({addSize:file.size}));}
  20. formData.append(key, file);
  21. let xhr = new XMLHttpRequest();
  22. xhr.open("POST", url, true);
  23. for (let keys in header) {
  24. xhr.setRequestHeader(keys, header[keys]);
  25. }
  26. xhr.upload.addEventListener("progress", function(event) {
  27. if(event.lengthComputable){
  28. let percent = Math.ceil(event.loaded * 100 / event.total) + "%";
  29. progress.innerText = `努力上传中..${percent}`;
  30. }
  31. }, false);
  32. xhr.ontimeout = function(){
  33. // xhr请求超时事件处理
  34. progress.innerText = '请求超时';
  35. setTimeout(()=>{
  36. tis.style.display = 'none';
  37. plus.webview.currentWebview().close();
  38. },1000);
  39. };
  40. xhr.onreadystatechange = (ev) => {
  41. if(xhr.readyState == 4) {
  42. console.log('status:'+xhr.status);
  43. if (xhr.status == 200) {
  44. progress.innerText = '上传成功';
  45. console.log('服务端返回数据:'+xhr.responseText);
  46. location.href = `callback?fileName=${escape(file.name)}&size=${file.size}&str=${escape(xhr.responseText)}`;
  47. }
  48. else {
  49. progress.innerText = '上传失败了';
  50. if (xhr.status == 0) {
  51. console.log('请检查请求头Content-Type与服务端是否匹配,并确认服务端已正确开启跨域');
  52. }
  53. }
  54. setTimeout(()=>{
  55. tis.style.display = 'none';
  56. plus.webview.currentWebview().close();
  57. },1000);
  58. }
  59. };
  60. xhr.send(formData);
  61. cancel.addEventListener("click", ()=>{
  62. xhr.abort();
  63. plus.webview.currentWebview().close();
  64. });
  65. }
  66. mask.addEventListener("click", () => {
  67. plus.webview.currentWebview().close();
  68. });
  69. document.addEventListener('UniAppJSBridgeReady', () => {
  70. let {url,key,header,formData,logo,maxSize,addName,addSize} = plus.webview.currentWebview();
  71. if (logo) {
  72. let img = document.createElement('img');
  73. img.src = logo;
  74. logoDom.appendChild(img);
  75. }
  76. fileDom.value = '';
  77. fileDom.addEventListener('change', (event) => {
  78. let file = fileDom.files[0];
  79. // 默认限制文件小于10M,可自行修改
  80. if(file.size > (1024*1024 * Math.abs(maxSize))) {
  81. plus.nativeUI.toast(`单个文件请勿超过${maxSize}M,请重新上传`);
  82. return;
  83. }
  84. createUpload(file,{ url, key,header,addName,addSize,data:formData});
  85. }, false);
  86. });