uploadFile.html 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. <!DOCTYPE html>
  2. <html lang="zh-cn">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title class="title">[文件管理器]</title>
  6. <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
  7. <style type="text/css">
  8. .content {background: transparent;}
  9. .btn {position: relative;top: 0;left: 0;bottom: 0;right: 0;}
  10. .btn .file {position: fixed;z-index: 93;left: 0;right: 0;top: 0;bottom: 0;width: 100%;opacity: 0;}
  11. </style>
  12. </head>
  13. <body>
  14. <div id="content" class="content">
  15. <div v-show="!disabled" class="btn">
  16. <input @change="onChange" :accept="accept" ref="file" class="file" type="file" />
  17. </div>
  18. </div>
  19. <script type="text/javascript" src="js/vue.min.js"></script>
  20. <script type="text/javascript">
  21. var xhr;
  22. var vm = new Vue({
  23. el: '#content',
  24. data: {
  25. accept: '',
  26. disabled: false
  27. },
  28. mounted() {
  29. let fileDom = this.$refs.file;
  30. fileDom.value = '';
  31. console.log('加载webview');
  32. },
  33. methods: {
  34. onChange(e) {
  35. let fileDom = this.$refs.file;
  36. let file = fileDom.files[0];
  37. let {size = 10} = plus.webview.currentWebview();
  38. // 限制文件小于10M,可自行修改
  39. if(file.size > (1024*1024 * Math.abs(size))) {
  40. plus.nativeUI.toast(`附件大小请勿超过${size}M`);
  41. return;
  42. }
  43. this.createUpload(file);
  44. },
  45. createUpload(file) {
  46. let {debug = false,url,name = 'file',method = 'POST',header = {},formData:data = {}} = plus.webview.currentWebview();
  47. if (!url) {console.error('url为必传参数');return;}
  48. data['fileName'] = file.name;
  49. debug&&console.log(`
  50. 上传接口地址:${url}\n
  51. 附件key:${name}\n
  52. 附件名称:${file.name}\n
  53. 附件大小:${file.size}\n
  54. 请求头:${JSON.stringify(header)}\n
  55. 参数:${JSON.stringify(data)}
  56. `);
  57. let formData = new FormData();
  58. for (let keys in data) {formData.append(keys, data[keys]);}
  59. formData.append(name, file);
  60. xhr = new XMLHttpRequest();
  61. xhr.open(method, url, true);
  62. for (let keys in header) {xhr.setRequestHeader(keys, header[keys]);}
  63. xhr.upload.addEventListener("progress",(event) => {
  64. if(event.lengthComputable){
  65. let percent = Math.ceil(event.loaded * 100 / event.total);
  66. if (percent <= 100) {
  67. location.href = 'callback?retype=percent&percent=' + escape(percent);
  68. }
  69. }
  70. }, false);
  71. xhr.ontimeout = function(){
  72. this.disabled = false;
  73. location.href = 'callback?retype=complete&status=408&msg=' + escape('请求超时');
  74. };
  75. xhr.onreadystatechange = (ev) => {
  76. if(xhr.readyState == 4) {
  77. let fileDom = this.$refs.file;
  78. fileDom.value = '';
  79. this.disabled = false;
  80. if (xhr.status == 200) {
  81. debug&&console.log('上传完成:'+xhr.responseText);
  82. location.href = `callback?retype=complete&fileName=${escape(file.name)}&responseText=${escape(xhr.responseText)}&success=true&status=${xhr.status}&msg=${escape('上传成功')}`;
  83. return;
  84. }
  85. else if (xhr.status == 0) {
  86. console.error('status = 0 :请检查请求头Content-Type与服务端是否匹配,服务端已正确开启跨域,并且nginx未拦截阻止请求');
  87. }
  88. location.href = `callback?retype=complete&fileName=${escape(file.name)}&status=${xhr.status}&msg=${escape('上传失败')}`;
  89. }
  90. };
  91. this.disabled = true;
  92. xhr.send(formData);
  93. }
  94. }
  95. });
  96. </script>
  97. </body>
  98. </html>