zip包加密上传OSS

zip包加密上传OSS

前提:这个针对这个功能里最复杂得三个方法进行讲解:
在这里插入图片描述
先说一下大致:1:第一步就是解压并加密,然后再改项目下生成一个加密后的一个zip文件,因为一开始前端掉这个接口,是一个没有带加密的一个zip包,所以需要解压重新打包,并将zip包放入到输入流里,因为本地代码和公司里的服务器里的地址肯定不一样,所以就先把这个加密的zip包放在了当前项目下的一个路径里,
2:第二步就是将第一步返回的带有加密后的一个改项目路径下的zip文件的流重新转成multipartFile,就类似于相当于重新掉了一次这个请求接口,因为接口的接收就是通过MultipartFIle去接收的这个zip文件,
3:第三步就是类似于将第一步带有加密的zip包创建在一个与服务器地址相同的一个路径里。然后将地址和密码记录在数据库里,这个ZsUploadFile是实体类。
4:第四步没在这里截图,第四步就是将带有密码的zip文件上传至oss,
总的来说就是这三步做了:解压+加密+在项目下打包成zip文件+类似重新请求+将以上的加密文件也在服务器一样的地址里打包一个zip文件

本篇文章是为了自己看不是只为了给你们看,写的烂勿喷
这篇文章使用debug一步一步分析
1、先从请求看起:【请求方式】:Post,【docType】:后续会用到这个充当地址,这里前段是写死的叫这个名字,这个无所谓,先分析接口的代码流程以及思想吧【bizId】:前端用uuid做的处理。
在这里插入图片描述
2、看一下在postMan中我是如何调通这个接口的,因为多租户的原因,这两个参数必须得带,以及第二张是为了区分多租户得数据库
在这里插入图片描述在这里插入图片描述
因为前端请求是从form-data所以这里就要对应【key鼠标放上去在末尾可以更改格式,text、file】
在这里插入图片描述
3、进入正题【java代码】:
在这里插入图片描述
【详解】
1、password:是根据UUID截取的16位
2、originalFileName:getOriginalFilename是文件的原始名字【getName和这个方法是有差别的,getName获取的name就叫file,自己可以试试】
3、subName:文件名不包含.zip
4、resultFileName:拼接了一下之后和originalFileName是一样的名字
4、进入177行代码看看操作:【仔细看看inputStream,知道这里面携带了什么东西么?
【这里先截图这些设置参数的东西,这些不用知道很详细,不用什么都卷】
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
【inputStream中携带的参数:】

【告知】:在postman中上传的文件,就放在桌面上,桌面的全路径就叫c:\users***等路径
在这里插入图片描述
【详解】:可以看出来在你上传文件的时候,系统就已经把文件给字节化了,.tmp后缀就是这个文件字节化的字节文件
【!!!!这块不理解为什么截图这个就往下看,会恍然大悟】
【看逻辑重点:】这里为什么会进入if条件看我写的其他文章:链接: File的exists判断路径
在这里插入图片描述
1、72行到76行就是为了判断这个文件存在不存在,存在就删除,不存在的话,在执行完这行之后也不会生成
2、78行使用ZipFile命名一个受密码保护的zip文件,执行到这一步其实本身是还没有创建出来zip文件呢,因为项目文件下没看到创建出来的zip包
3、处理源文件是zip文件的,解压再压缩加密 ,执行到85行本身也是并没有建出来这个与源文件名字一样的file包==【重点是86行】
4、86行
【解析】==
在这里插入图片描述
【解析】:
(1)、这里就需要用到我上面所提过的哪个inputStream携带的参数重要性了
(2)、这个方法中的file是第3、点刚才所说的,为什么说执行完刚才的第3、点并没有创建与源文件名字相同的zip。
是因为,刚才并没有执行创建操作,你可以理解为刚才的New FIle(“名字.zip”)只是定义并不会执行创建操作,
(3)、回到这个方法里,执行完178行的FileOutputStream 文件输出流之后才会创建这个与源文件相同的zip文件。
依据事实说话:【这是当我再执行完178行之后才会出来的,执行85行的时候也查看了,项目路径下并没有文件】
在这里插入图片描述
(4)、【注意:虽然名字一样但是包不一样,我上传的也叫这个名字的包,千万不要理解为是把上传的文件复制了一份过来,压根不是一回事但是这里创建的是新的包 数据说话:】
在这里插入图片描述
5、在知道创建文件了之后,接着往下看==【解释这个循环的意义】==
在这里插入图片描述
(1)这个循环的意义就是带有源文件地址的输入流inputStream每次读取1024个字节,然后使用FIleOutputStream进行输出
每次循环的write是给里面写数据,【我这个文件是101mb】是1024字节的很多倍,所以可以循环很多遍,先来用数据证明事实:循环一次看看文件大小:在没有执行之前的大小是0,在我执行之后:
在这里插入图片描述
6、回到主流程里:
在这里插入图片描述

(1)、87行意思:【别忘了在那个方法里执行完后会在该项目下创建一个输出流的一个prophet,zip的zip包】,此时这里的
New ZipFile("prophet.zip),取得是该项目下得那个zip包,不是去创建
(2)、90行命名一个.\prophet的文件夹
(3)、只有再92行的时候才会去创建
在这里插入图片描述
(4)、可以看一下日志打印出来的路径
在这里插入图片描述
(5)、看一下执行完92的命令看看文件夹里的内容:【是空的】
在这里插入图片描述(6)、执行95行得意思:【因为再那个方法里执行了FileOutputStream生成了一个名字叫prophet.zip的一个File】,
此时执行95行的意思是,把刚才生产出来的prophet.zip包里的文件复制一份到prophet的文件夹里:
在这里插入图片描述
7、接着往下
在这里插入图片描述
(1)、别忘了一开始命名了一个同样为prophet.zip并且带有加密的一个zipFile,当执行完这一行的之后所表现的就是
将创建出来的那个文件夹解压并带有密码的解压,我来解释一下密码我先不执行这行代码给你看一下我点击这个prophet.zip这个zip包是什么样子的
在这里插入图片描述(2)、再给你看一下这个prophet.zip的创建时间,后续会验证
在这里插入图片描述
(3)、我执行一下这行代码看结果:
在这里插入图片描述
(4)、可以看得出来,这是通过执行这行代码进行将prophet的文件夹解压之后的要给zip包,我再验证一下是否带有密码:【可以看出来当我点击里面的文件时问我要密码】,这样一来就大功告成了哦
在这里插入图片描述
8、接着往下,【由于中间的zip包太大了 我中途换了一个536字节的一个文件】
在这里插入图片描述
(1)、删除临时文件是指删除的是创建的按个prophet的文件夹
9、接着往下【这个respFIle是刚才解压完带有密码的zip包的对象】,目的是将这个信息写入到写入流中携带,
在这里插入图片描述
10、验证9的这个思想:
在这里插入图片描述
(1)、虽然这个path路径只有这个包名,但是别忘了 这个是隶属于该项目下的路径,这里从始至终,项目下的路径都不打印,如果会打印的话我也不会去写那个File的博客了

-------今天先写到这里--------由于今天上线,就有空写了写这个,这部分只是给加密的步骤解释完了,后面的下次再讲-------
在这里插入图片描述
11、继续往下走:【118行】从图中可以看出来这个New MockMultipartFile是实现了这个MultiPartFile这个接口了
【参数:1.与源文件名字相同的zip文件2.与源文件名字相同的zip文件3.前端传来的那个AD_IMG3的路径,4.带有密码的zip文件的inputStram流】【代码如下:】
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
【从参数的数量就可以看出来 进入了42行代码,this之后去到了34行代码里】,可以看出来通过FIleCopyutils.copyToByteArray等给改类的属性赋值了【看数据:content是zip文件的流的字节】【此步骤就类似与重新调用接口一样,之前调用接口不也是用这个类接收的么,里面包含了也是这些信息,不过不同的就是这次再这次转成这个接口的文件流是带有密码的一个zip文件】
在这里插入图片描述
12、继续看119行,代码如下:首先【参数:】【1.multipartFile对象,bizId【前端传过来的uuid】,docType:AD_IMG3路径,multipartFile.getOriginalFilename从上面就能看出来是带有zip的名字,password:是112行生成的密码】
在这里插入图片描述

【详解:】,61行是获取再yml文件中定义的路径d:/mercury,62行是拼接路径呢,路径就是上面带有时间的路径
64行到70行是给数据库里的表填充信息,71到74行是获取多组合的用户id。
在这里插入图片描述
【87行以上都是填充数据库,和多租户的东西。】【其中83行是再实体类中定义了一个输入流】截图如下:
在这里插入图片描述
【87行是自己写的一个类,并不是什么第三方类】【88行方法进入:】这个方法里的内容也很多下面得都是
在这里插入图片描述
【下面这个类NativeFileServerAttachment及继承了上面的AbstractAttachment类,这个AbstractAttachment并没有继承任何类和并没有实现任何接口】
在这里插入图片描述
【由于这里子类返回的是false,所以不会进入if语句】
在这里插入图片描述

【进入52行里看代码:是上面的那个抽象方法,别忘了NativeFileServerAttachment及继承了上面的AbstractAttachment类,所以重写了这个uploadFile方法内容如下:【其中那个in是FileInputStram,与上面讲的那个加密不同的是多了个File,这里参数是null,另外一个参数ZsUploadFile这个是数据库中表的实体类,勿忘】】
在这里插入图片描述
【20行得getDocType是数据库里得字段,这里得参数不是上面数据库里填充后的对象么。】
【24行是获取这个文件得大小,返回的是字节大小】
【25行是通过spring得bean工厂获取yml文件里的数据BEAN_ID】这个截图说明一下,重要的是getUpload这个方法
ctrl+左键点击BEAN_ID得截图:就是这个类里面得东西,这个不明白可以去看spring启动加载类得文档
在这里插入图片描述
【主要的是这个类里的upload方法】:这个Upload这个类是个内部类
在这里插入图片描述
在这里插入图片描述
这两个属性是对应的是yml文件中的字段,这个CustomPropertires这个类带有这个注解:
在这里插入图片描述
【这个customePropertries是在另一个服务下得类,因为使用了comment所以启动的时候就加载了,然后在别的服务中yml文件中是带有这个custom得字段的】
在这里插入图片描述
所以这个返回得对象得内容只有这两个:
在这里插入图片描述
【32行】我就不讲了,就个地址拼接,
在这里插入图片描述
【32行】地址拼接得内容如下:这个createFileDir里会创建这个路径得文件夹得所以 【操 是真不想截图了 但是为了避免不能理解还是截图一下吧】
在这里插入图片描述
createTileDir方法截图如下:
在这里插入图片描述
在来看33行:【33行】就是拿着哪个地址和原文件名。if判断是:不存在的所以进入if里面,这个进入里面,未执行if里面得代码时:
在这里插入图片描述
执行之后:
在这里插入图片描述
【36行细节分析:】注意得是uploadFile是一开始数据库表实体类得对象,还记得当时在字段里加了个注解,然后给这个inputStram字段赋值了吧 如果不清楚可以网上看,这个FIleUtils是commons-io得一个工具类,这个copyInpuStramToFile得底层还是通过写入流读取数据然后使用输出流输出到file路径下的zip里,这个zip也是它这个方法去创建得使用的是输出流创建得
在这里插入图片描述
接着往下走看else里的方法,这里就不细讲了,cv就完事了截个图:
在这里插入图片描述
在这里插入图片描述
这个fos是在这个类里建的一个FileOutPutStream对象,属于java io 下的类
紧接着回到之前得类里:这里还是哪个adstractAttachment.add方法里,
上面讲的是这个:
在这里插入图片描述
ok! 88行里的方法以及很多个子方法都讲完了 继续往下走
在这里插入图片描述
接下来看89行,这里的意思就是获取一开始加载得bean,这个是serviceImpl得类,我给你看这个类里的加载时叫什么名字:
因为这个是serviceImpl类,里面已经实现了dao。save得方法,这里就是用那个方法保存到数据库里
在这里插入图片描述
在这里插入图片描述
ok!!!!!这三个最复杂得都讲完了
在这里插入图片描述
值得注意的就是这个返回的对象:是实体类。
接下来是上传至Oss,【123行是内部的东西 无需在意】,【至于为什么是FileUploadReq这个类,是我们自己建的类,我们的远程调用的接口需要的参数类是这个FileUploadReq所以只能建立这个类,然后去赋值,再去远程调用上传至oss了】
在这里插入图片描述
【可以看到139行又对那个实体类进行了入库操作,是因为Fsid是上传至oss的id,所以要记录在数据库里,上面的第三步当时保存的时候并没有这个fsId所以,这里再次去对数据库进行了修改】下面还有一些代码 我也截图下来,保证完整性:
在这里插入图片描述
--------------------------------远程调用oss的方法下次再说,还有别的事情要做------------------------------------
进入方法如下:
在这里插入图片描述
【首先】我们先看一下这个远程调用接口返回的vo是什么:
在这里插入图片描述
由于前面我们远程调用之前的对象是没有这个businessType的所以是null
在这里插入图片描述
别忘了,我们在上面三个方法完成的时候已经在服务器相同的地址里上传了一个带有密码的zip包
177行可不是什么创建zip包啊,这个是上面这句话说的已经有了一个zip包,这行代码的意思是拿到地址和zip包名字,通过构造器将这zip包写入到写入流里,最后进行在ossClient上进行上传用。
在这里插入图片描述
【179行的if】里面的意思是就是为了获取后缀用,在拼接上前面的一个随机生成的字符串
在这里插入图片描述
这个objectKey是oss文件的id最后是要传给上面的FsId;
我们可以看看接下来开始远程上传的返回结果:【其中ossClient屎OSS接口,putObject方法我也不太懂,只知道一个参数:
参数一是桶的名字,二是自定义的ossId,三是输入流,里面带有加密的zip文件】
在这里插入图片描述
最后:这个setObjectAcl我也不太懂都是下面图中接口的方法。
在这里插入图片描述
在这里插入图片描述
大功告成!!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值