js+html+springboot实现文件夹上传遇到的坑及其解决方案!

最近由于项目需要开始在之前文件分片上传文件的基础上实现文件夹的上传。在开发B/S架构的文件夹上传时遇到了一下问题,并给出我们的解决方案以供参考。如您有更好的方案也欢迎及时的交流。

问题一:H5获取文件路径之后只有文件完整的相对路径串,不能直接获取他的父目录以及子目录?
首先,简单示范一下H5中获取文件完整相对路径的方法,获取到的路径形式一般为:test/a/b/c.txt的形式,如下:

var files = event.target.files;
var i=0;
var fullFilePath = files[i].webkitRelativePath;// 包含文件名的完整路径

问题分析:
由于不能像windows下可以直接使用isDirectory或者isfile之类的函数,所以只能取出文件的完整路径,然后根据已经创建了的路径列表来判断该级目录是否需要创建,而不能按照目录层级一级一级的去上传。
解决方案:
取出文件的完整目录串,拆分之后逐级判断该级是否需要创建,问了防止存在目录名称相同的情况,可以使用取完整的目录串的形式判断,即:判断test/a/b/是否存在时,需要先判断test若创建再判断test/a已经创建,再判断test/a/b已经创建。或者使用目录对应的ID串的形式判断一个目录是否已经创建。

问题二、前台是否允许存在同名文件夹?
可能在本地的C:\和D:\下都存在一个叫做test的目录,但是内容不同,这时需要允许上传这两个同名文件夹。所以这种情况必须要实现前台允许同名目录结构在同一父目录下存在的情况。

问题三、在前台创建目录还是在后台创建目录的问题?
问题分析:
(1)在前台创建目录,需要ajax请求等待后台创建完成之后才能进行上传,可能会影响上传的效率。
(2)在后台创建目录,由于前台传递给后台的是需要创建的目录串,因此当创建的根目录是相同的名称的时候,后台只能按照该目录已经存在的形式不进行创建(如果继续创建,当创建的是一个根目录下的子目录,可能会遇到本来不需要创建,但是后台却创建了的情况)。
解决方案:
前台获取文件完整路径之后拆分并重新合并之后判断目录是否需要创建,如果一个目录需要创建,则将该级及该目录之后其他没有创建的目录在后台完整的创建出来。
例如:test/a/b/c/目录现在已经存在test目录,判断出test/a目录不存在的时候需要在后台创建出test/a/b/c/这个完整目录,创建完成之后返回给前台。

问题四、ajax请求是异步请求,但是需要保证请求按照指定顺序执行?
问题分析:
比如,目录结构创建成功之后才能上传文件到该目录下,否则不能上传。
解决方案:
使用了原生的ajax请求,通过ajax里面的onload方法,当创建目录的任务返回的状态为成功的时候再继续执行下一个ajax请求。

**问题五、由于对执行顺序的要求,对文件夹的遍历不能使用for或者while进行循环的问题?
问题分析:**
这里只能将ajax请求分成两类,一类是需要创建目录的向后台发送请求创建目录,另一类是不需要创建目录的这时候可以直接上传文件。
解决方案是:
(1)从文件数组里面取出一个文件的信息;
(2)如果需要创建目录则发送请求创建目录,创建成功之后,执行(3);
(3)如果不需要创建则发送上传文件的请求,上传成功之后取下一个文件信息;

这几天我会整理文件上传、文件夹上传、文件下载相关代码,整理完成之后会完整发出,欢迎关注。

以下是我的个人公众号,主要作为C/C++语言技术分享使用,该公众号里干货满满,如果您有对此博文的疑问或者java方面的问题也可以添加公众号交流讨论。最后,再次希望您能添加关注,互相交流互相学习共同进步:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/coding13/article/details/78712488
今日推荐