index.vue 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. <template>
  2. <web-view
  3. ref="webViewRef"
  4. :webview-styles="webViewStyle"
  5. :style="webViewStyle"
  6. :src="`/hybrid/html/select-file/index.html?accept=${accept}`"
  7. name="selectFileIframe"
  8. @message="handleMessage"
  9. />
  10. </template>
  11. <script setup>
  12. import {ref, onMounted, getCurrentInstance} from "vue";
  13. import {onUnload} from '@dcloudio/uni-app'
  14. //初始变量
  15. let wv;
  16. const webViewStyle = ref({
  17. height: '1px',
  18. width: '1px',
  19. top: '300px',
  20. })
  21. const props = defineProps({
  22. accept: {
  23. type: String,
  24. default: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel,application/pdf,.doc,.docx,application/msword'
  25. }
  26. });
  27. const webViewRef = ref(null)
  28. //事件
  29. const emit = defineEmits(['change'])
  30. //渲染完成
  31. onMounted(() => {
  32. // #ifdef H5
  33. window.addEventListener('message', handleMessage);
  34. // #endif
  35. initWebview()
  36. })
  37. //初始化webview
  38. const initWebview = () => {
  39. // #ifdef APP-PLUS
  40. const instance = getCurrentInstance().proxy.$parent
  41. let currentWebview = instance.$getAppWebview()
  42. //如果是页面初始化调用时,需要延时一下
  43. setTimeout(() => {
  44. wv = currentWebview.children()[0]
  45. }, 1000);
  46. // #endif
  47. }
  48. const handleMessage = (event) => {
  49. let msg = {};
  50. // #ifdef H5
  51. if (event.data && event.data.data && event.data.data.arg) {
  52. msg = event.data.data.arg
  53. }
  54. // #endif
  55. // #ifdef APP-PLUS
  56. msg = event.detail.data[0]
  57. // #endif
  58. console.log('event.detail', msg)
  59. if (msg.source === 'file-web') {
  60. if (msg.type === "selectFileChange") {
  61. selectFileChange(msg.data)
  62. }
  63. }
  64. }
  65. onUnload(()=>{
  66. // #ifdef H5
  67. window.removeEventListener('message', handleMessage);
  68. // #endif
  69. })
  70. //选择文件
  71. const selectFile = () => {
  72. // #ifdef H5
  73. window.frames["selectFileIframe"].postMessage({
  74. type: 'selectFile',
  75. source: 'file-app',
  76. data: {}
  77. });
  78. // #endif
  79. // #ifdef APP-PLUS
  80. wv.evalJS(`selectFile()`)
  81. // #endif
  82. }
  83. //文件选择完毕
  84. const selectFileChange = (files) => {
  85. if (files && files.length > 0) {
  86. let file = files[0];
  87. const reader = new FileReader();
  88. reader.readAsDataURL(file);
  89. //监听文件读取结束后事件
  90. reader.onloadend = function (e) {
  91. //e.target.result就是最后的路径地址
  92. emit('change', {
  93. file: file,
  94. path: e.target.result
  95. })
  96. }
  97. }
  98. }
  99. //到处函数
  100. defineExpose({
  101. selectFile
  102. })
  103. </script>
  104. <style scoped lang="scss">
  105. @import "./style.scss";
  106. </style>