问题描述
当拖拽文件夹上传时,实际上将文件夹当作文件上传的。换言之,并没有拿到实际的文件列表,包括在多选的时候,选上了文件夹。如果抛弃使用 element-ui
的 uploader
,使用 input
,在拖拽的时候,若是没有权限允许,以久没办法拿到文件信息。
Open file:
解决思路
- 在
drop
事件中获取 e.dataTransfer. Items
,是一个 DataTransferItemList
对象,遍历得到 DataTransferItem
对象 - 用
webkitGetAsEntry
方法得到 FileSystemEntry
对象 - 根据
isFile
属性判断 entry 是文件还是文件夹。是文件的话,用 file
方法获取 File
对象;是文件夹的话,递归地用 reader
读取包含的文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| <template> <el-container> <el-upload class="upload-demo" :auto-upload="false" drag action="#" multiple :file-list.sync="fileList" :before-upload="handleChange" :on-change="handleChange" :show-file-list="false" > <i class="el-icon-upload"></i> <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div> <div class="el-upload__tip" slot="tip"> 只能上传jpg/png文件,且不超过500kb </div> </el-upload> </el-container> </template> <script> export default { name: 'App', components: {}, directives: { webkitdirectory: { inserted(el) { // 递归获取 function getFileFromEntryRecur(entry, cb) { if (entry.isFile) { entry.file(file => { let path = entry.fullPath.substring(1); cb({file, path}); }); } else { let reader = entry.createReader(); reader.readEntries(entries => { entries.forEach(entry => { getFileFromEntryRecur(entry,cb); }); },e=>{ console.log(`e-->`, e); }); } } // Hack 部分 el.querySelector('.el-upload-dragger').addEventListener('drop', (data) => { for (let each of data.dataTransfer.items) { const entry = each.webkitGetAsEntry(); getFileFromEntryRecur(entry, (file) => { console.log(`file-->`, file); }); } }); }, }, }, data() { return { fileList: [], }; }, methods: { handleChange(file) { console.log(file); }, }, }; </script>
|
同样的对于 input
,也可以基于此方法进行修改。
但是,文件的相对路径格式不统一,需要处理,统一格式为文件夹 1/文件夹 2/a.txt
。
途径相对路径说明
Open file:
API 兼容情况
Open file:
注意事项
!注意
webkitGetAsEntry
这个函数在读取某个文件夹的文件数大于100个时只会读取前100个
参考信息
参考链接
上传三合一:拖拽上传、上传文件、上传文件夹,一次搞定!_呀呀夫斯基的博客-CSDN博客
GitHub - fex-team/webuploader: It’s a new file uploader solution!
拖拽本地文件夹到浏览器中,展示所有文件结构_webkitgetasentry_呀呀夫斯基的博客-CSDN博客