小巫程序Demo日记:今天完成了文件的上传,分类和解压
自从昨天业务经理给了我需求后,我便开始想着我这个清洗工具的架构。
主管:“小巫啊,你现在这个清洗工具还是太臃肿了,有没有简单又强势的清洗工具给我来一下”。
我:“有的主管,有的,像这种清洗工具我还有九种写法,分别是单线程依次处理,多线程并发处理,多线程同步处理,spark自身的高额并发处理能力,Java序列化处理…”。
主管:“停停停,小巫啊,我觉得spark和多线程还可以哦,但是我这个需求可能有点多。“
我:”没问题啊主管,我再和您说一下这些方法应该怎么去做实现。“
我:”巴拉巴拉巴拉…“
主管:”可以的“
我:”…“
主管:”那你去做个Demo给我看看效果吧(原来是不急着上线啊,懂了)“
我:”好的主管,那么我就搞点高技术的工作了,多线程+spark处理。“
主管:”ok“
那么昨晚和主管聊了之后,我的大脑就浮现大量的思维架构图,脑图,还有实现方法,但是奈何太困了,就告了段落,那么接下来,我将会吧我的思维架构脑图通过一个架构图,让各位能够先直观的看到。
架构图
+------------------------------------------+
| 表现层 (UI/API) |
| +------------------------------------+ |
| | interfaces/controller | |
| +------------------------------------+ |
+------------------------------------------+
|
v
+------------------------------------------+
| 应用层 (Application) |
| +------------------------------------+ |
| | process | |
| +------------------------------------+ |
+------------------------------------------+
|
v
+------------------------------------------+
| 服务层 (Service) |
| +------------------------------------+ |
| | service | |
| +------------------------------------+ |
+------------------------------------------+
|
v
+------------------------------------------+
| 领域层 (Domain) |
| +------------------------------------+ |
| | domain/model | |
| +------------------------------------+ |
+------------------------------------------+
|
v
+------------------------------------------+
| 基础设施层 (Infrastructure) |
| +------------------------------------+ |
| | config | spark | infrastructure | |
| +------------------------------------+ |
| | util | common | exception | schema | |
| +------------------------------------+ |
+------------------------------------------+
看到这你可能会问了,”你这啥东西啊“。
看不懂吗,no,看得懂吗,no,其实这就是一个基于SpringMVC的一个大体架构图,我直接甩出来看不懂是很正常的,看懂了说明你跟我是同步在线的,那么开始吧,我在给个图大家就应该看得懂了。
数据流程处理图
这样子是不是就明了很多了,我们的需求就是合并不同文件类型和不同文件名但表头类型表达的意思都一样的文件,那么我们首先要做的就是给用户提供文件上传的接口,这个接口需要考虑三点:
- 如果文件是压缩包,则需要先解压缩
- 如果文件是正常文件,需要判断文件名字,方便划分文件类型
- 如果是压缩文件和正常文件一起上传则优先解压文件,在通过文件名字和文件内容的表头去判断划分文件类型
那么,实现这个需求的话要求我们需要对Java生态的熟悉才可以迅速做出来,比如,解压zip文件我们需要用到ZipInputStream这个方法,具体的知识点我后续会更新在Java分栏中,这里只讲这么做的。
文件上传接口和分类处理以及解压缩怎么做
为了避免本文全是知识点无任何亮点,我接下来会以沸羊羊的视角来讲解这个知识点
第一步:接收和处理文件(processUploadFile 方法)
首先我们代码的入口是 processUploadFile 方法,它负责接收小美发来的文件(MultipartFile file),然后根据文件类型决定怎么处理。
场景 1:这个时候小美突然在微信给你发来了一个压缩包(zip 文件)
你满欢欣喜的打开微信,发现小美给你发了一个文件叫做“账单合集.zip”,里面有“包包.csv”和“购物记录.csv”。
- 此时你会做什么(代码做什么):
- 肯定是先看看自己买的18手手机的内存还够不够了,不然等会内存不够,微信自动删了怎么办,那么如果我们没有内存了,我们是不是要插进去一个内存卡,来保存小美给我们的东西。【检查上传目录(uploadDir)是否存在,不存在就创建(Files.createDirectories)。】
- 然后我们需要用肉眼去辨别这个文件是什么文件,如果是压缩文件,我们需要去解压缩它。【判断文件名是不是以“.zip”结尾(fileName.endsWith(“zip”))】。
- 如果是压缩包,就调用解压方法(unZipFile)。
- 解压过程(unZipFile):
- 小美发的“账单合集.zip”被解压,里面的文件被提取出来,你的手机自动保存到 uploadDir。
- 这个时候,你为了避免你手机的文件太乱,搞了个小分类,小美给的文件你都很仔细的划分了这个分类,这时候你的手机先是自动的把它保存下来,然后你才能去对这个文件进行分类,“包包.csv”和“购物记录.csv”会被放到 uploadDir 文件夹里。
- 这就像你收到一个小美的礼盒,打开后把里面的小礼物拿出来。
场景 2:小美发来一个 CSV 文件
这时候小美直接发了一个“支付宝账单.csv”。
- 代码做什么:
- 这个时候你已经直接看到了这个文件,你知道它的文件格式,所以不需要解压【检查文件名是以“.csv”结尾(fileName.endsWith(“csv”))】。
- 然后你就直接保存了。//调用保存方法(saveCsvFile)。
- 保存过程(saveCsvFile):
- 把“支付宝账单.csv”直接保存到 uploadDir,不需要解压。
- 这就像你收到小美的一个单件礼物,直接放到桌上。
如果文件类型不对
- 如果小美发了一个不支持的文件(比如和男神的啵啵照片),这个时候你也就是代码会抛出异常(IllegalArgumentException),告诉你“当前文件类型不支持”,你会当作看不见,直接不要了。
第二步:分类文件(classifyFiles 方法)
现在 uploadDir 里有了文件(可能是解压后的,或直接保存的),你需要把它们分类。分类的过程由 classifyFiles 方法完成,它用了 Apache Spark(JavaSparkContext)来加速处理。
分类规则
- 如果文件名里有“包包”,归到“包包”类别。
- 如果文件名里有“账单”,归到“账单”类别。
- 如果文件名里没有这些关键词,就看文件内容:
- 如果内容以“包包100000块钱”开头,归到“包包”类别。
- 否则,归到“其他”类别。
场景 1:处理“账单合集.zip”解压后的文件
uploadDir 里有“包包.csv”和“购物记录.csv”。
- 代码怎么分类(classify 方法):
- “包包.csv”:
- 文件名里有“包包”,直接归到“包包”类别。
- “购物记录.csv”:
- 文件名里没有“银行”或“支付宝”,需要看内容。
- 假设内容不是以“包包100000块钱,”开头,归到“其他”类别。
- “包包.csv”:
- 移动文件:
- “包包.csv”被移动到 classifiedDir/包包/csv/。
- “购物记录.csv”被移动到 classifiedDir/其他/csv/。
场景 2:处理单个“支付宝账单.csv”
uploadDir 里有“支付宝账单.csv”。
- 代码怎么分类(classify 方法):
- 文件名里有“支付宝”,归到“支付宝”类别。
- 移动文件:
- “支付宝账单.csv”被移动到 classifiedDir/支付宝/csv/。
文件格式(getFileFormat 方法)
- 代码还会检查文件是 CSV 还是 Excel(.csv 或 .xlsx),目前例子中都是 CSV,所以用的是 csv 子文件夹。
第三步:移动到分类文件夹
分类完成后,文件会从 uploadDir 移动到 classifiedDir 下的子文件夹(Files.move)。文件夹结构会是这样的:
- classifiedDir/银行/csv/
- classifiedDir/支付宝/csv/
- classifiedDir/其他/csv/
这就像你把小美的礼物整理好,放到不同的抽屉里。然后把和男生的照片全删了。
这也就是一整个文件上传分类和解压的过程了,大家有需要源码的callme,我会发给大家哦,今天就到这了,溜了溜了。