00:00
我们首先呢,对这个file upload呀,来做一个简要的复习。我们用的是阿帕奇的comments,非阿洛的主件来完成的文件的上传,这里边有几个点还是需要我们好好的回顾一下,我们看一下。打开我们那个笔记哈。来,我们看最底下。这是往上看哈,服务端哦。还有一个客户端啊,这个进行文件上传的时候呢,这个表单需要做的准备有这样的,嗯几点,第一个就是请求方式一定要是post,第二个我们要使用fail这个表单域,就是说这个时候这个type是fail,以前这个type什么text啊,Password radio啊,我们写过好多,而这块这个叫fail,这个的话呢,会帮我们生成一个带按钮的一个这个框,我们可以去定位某一个文件。还有一个呃,编码方式改为multi part form data,那这种编码的话呢,意味着我们是以二进制的方式来提交数据,好。
01:26
好了,关于这个encoding type,我们这块的话呢,有一个详细的解释,那服务端很需要注意的就是如果你客户端指定这个encoding type是multi part form data的话,服务端不能够使用这样的方式再获取请求信息,昨我们是不是试了呀?这不行了,所以说今天早上还有同学问是么老师,那你那块你直接get de得了呗,获取不着。因为我们已经是以二进制的方式提的数据,而这个是不是直接取一个字符串啊,它取不到,好了,但是我们可以用输入流的方式来这个获取,但输入流我们也看到了是吧?那个特别复杂,我们要自己去拆分的话呢,很麻烦,所以说哎,我们建议使用这个comments fair upload建议使用它,同样使用这个的话呢,搭建环境非常简单,来拷入两个架包,然后我们说一下基本思想。
02:28
就是我们在一个这个表单里边,大部分还是一般的那个文本域吧,比方说user name啊,Password呀,兴趣爱好啊,男女啊,好可能有那么一两个啊,上传一张照片啊,一个文件啊,啊这个时候我们需要一个文件语好了,那commons upload它是怎么做的呢?哎,我们首先我们用commons upload可以去解析那个请求,得到一个file file item的一个集合,实际上是一个list。
03:05
好了,这个file item是什么呢?哎,他把表单里边的每一个这个表单域,每一个包含一般的文本域,呃,密码,还有那个文件域都。转为一个file item,对象无论是什么啊,都是一个file item,只要你是一个一般的一个这个input,什么check box,什么radio,都是一个file item,那这个时候的话呢,我们就可以用file item来判断一下,你是一个文件上传,你还是一个一般的这个呃,文本域啊,啊,用这个is form field来判断,那这个的话呢,如果这个要是返回true的话,意味着什么呀。它是一个一般的呃文本域,一般的表单域,而不是一个文件域,好了,你判断好之后的话呢,进一步进一步获取信息,如果确实是一个表单域的话,直接获取value,那这块你会有什么疑问吗?
04:13
应该会有疑问,那如果他是一个多选的话,我怎么获取。嗯。懂这个意思吧,单选没问题,要是多选呢,那你会不会想item有一个get,获取一个什么,获取一个string的一个数组啊,或者是集合呀,于是我们看一下来,就这个里边吧。啊,这个里边点get,我们看一下。这里边儿吧。你看你要是一盖的话,是不是还确实都是字符串啊。
05:00
哎,那这个时候这个问题就出来了,如果确实是一个多选的话怎么办,那你不能获取不着啊。大家说了。那他说呢,要多选的话,他应该如何来处理啊。你看我是不是没我这样写,这样定位还不这个那样去写的话呢,看着效果可能不是特别明显这样写。大家看我前面是不是一个string数组啊,我一点的话没有一个方法返回一个string数组吧,因为ecl很智能,它会根据前面这个返回值的前面这个类型自动去匹配那个方法吧,没有,那如何处理?哎,这是这是我们需要想的问题,如何处理啊。那这个的话呢,暂时我先记上哈,那一会的话呢,我们一起来说。
06:01
我写个那个兔吧,我来底下写吧。问题一说,如果是一个多选,如何获取对应的字符串数组,你现在你要是想的话,如何获取?大家能想到吗?过来我写个多选,大家看一眼来,所以说呀,我们要是就是简单的实现一个文件上传来说是吧,太easy了,太easy了,但是你要把它做精细了,OK,这里边有很多很多东西需要去看。
07:08
就任何一件小事是吧,我们我们每个人都会犯这样的毛病,这块太容易了,是看上去很容易,一做的话,你就会发现他没有那么的容易,特别是把这个事做好,大家可能经常这个这个出去哈,就是在那个那个,嗯,回龙观的那个。就就什么地儿,就物美那块有卖有卖那个烤冷面的,有两家卖的烤冷面这个事儿其实应该不是那么难,但是有一家的生意非趁排队,另外一家没有人,就这么一件事。那为什么那家会这个这个这个会排队,而另外一家没有人,这是为什么?你说他他做的就不好吃吗?呃,可能是,还可能有别的原因。
08:02
所以说想把一件事做好啊,没那么容易是吧,我们这个也一样,我们可以看一看来,比如说。点put type name,比方说我写个interest。INTERESTING6雪哥这个。好,我写四个兴趣爱好啊,看这个。这个呢,我们可以是一个party聚会。他呢?然后兴趣爱好是吧,我感一般的时候,老师你可以写个够是吧,也不大好,我可以写个shopping。
09:13
好了,我这样写完了,你会想到它是怎么回事吗?我都这样写完了,你会想到他是他是怎么干的吗?讲到吗?应该会想到了吧,对,哎,每一个都对应着一个file item对象吧,对吧,他们的这个名字是不是都一样啊,就那个field name,那这个时候的话呢,我可以获取到四个字符串,是不是刚好组成一个字符串数组啊,懂了吧,当然如果你勾选的话,哎,OK,这块我们可以来说一下,说每一个。
10:01
都对应一个file对象,这就可以了,你就这样解决。好了,回来我们再看,然后呢,呃,如果要不是一个这个表单域的话,就意味着它是一个文件上传域,就是一个文件域,我们可以来获取呃,内容类型,呃在不在内存里边大小,重要的是可以来获取输入流,有输入流的话,我是不是就可以把那个文件保存在服务器的某一个磁盘下了呀,对吧。I0输出,输出嘛,就解决了,OK到这块的话,实际上我们这个,呃,最基本的这最核心这个思想就OK了,那具体实现这个代码纯粹是复制的,嗯,这就是刚才这个好了,具体说的话呢,也就这么一点,然后昨天还有一个问题,我们也跟大家来交代一下,就是问题二。
11:09
临时文件夹,临时文件夹如何清空的问题?啊,本身的话呢,我们看那个文档里边,我们发现它给提供了一个方式,它给提供了一个listen的叫什么呀,叫监听器,不过那个监听器啊,回去好好看了一下是吧,那个监听器实际上它会启动一个线程,随时去扫描文件夹里边有没有文件,大家懂吧,有文件删除,没有文件啊就不删除,没什么删的嘛,一会儿然后就扫描它特别特别的呃,耗资源,所以说这种方式的话呢,并不建议,哎我们这样来说啊,手工删除来取手工删除的方式。
12:02
啊,手工删除的方式。我写了一个fair u,这个我们上课就不写了啊,因为然后在这个上面去这个花花费时间的话呢,也也也确实是冲淡我们这个主题,它可以干什么呀,可以清空这个,呃,指定文件夹的所有文件,这里边还用了一个递归。回头我把这个发给大家啊,就可以使用它来进行删除。那我们在面试的时候啊,有人就问这样的一个问题,说你知道递归吗?我说我知道啊,啊问递归能干什么啊,沉默不语,递归,你比方说我们举一个例子哈,这块就是一个很好的例子,比方说我想删除文件夹里边的文件的话,这就是一个递归,因为文件夹里边是不可能还有文件夹呀,这不就是一个递归吗?
13:02
好了,过吧。啊,这去掉行,这个OK了,好了,回来看我们这个需求,我们这个需求呢,昨天演示了哈,说的挺清楚的,第一个呃,我们搞了一个j query。这个解块了呀,昨天失误的地方就是开始的话你就随便随便搞了一个那个页面,我没有任何的定位,如果要是加的话还没问题是吧,删的话是不是就很麻烦呢?特别是如果要光删的话也行,删完之后你你是不是还得排序啊,你发现排序很困难,所以说我们给它改为了放在一个table里边,这个时候我可以精准的去定位点query,然后的话呢,呃,我们就来搞文件上传这个逻辑好了,我们回来我们看一下我们现在这个呃,文件的上传这几个步骤。
14:04
找到我们的几个步骤呢,这个时候我这个代码写完了呀,我们怎么看。往这看,大的步骤的话呢,就是这样的几步里边一个一个细分的,我们在写一个方法的时候,永远不要把那个方法写的超长,我们有一种方式是什么呀?我当然可以在这个里边把所有任务都完成吧,但那个代码可能会很长,是不是不便于维护啊,而且也不便于重用。大家可能不懂那么多是吧,但你一定懂得,哎,我这样写那样写好。那同时老师说,你怎么能这么写啊,是吧,我这么写也不是一天练成的,也是写了。挺长时间才有这样的一个基本的思想,比方说这一步就是获取这个,呃,Survey file upload,然后的话呢,我们可以来获取啊,File item的集合给去掉吧。
15:08
然后哎,我们搞到了一个fill upload,这一步比较关键。我们搞到这个集合以后,这个集合离我们的要求啊,差的还挺远的,怎么回事呢?我们是要干什么呀?我们是要干这件事,大家看一下哈。APP下边的loadp,好了,我们就要来干这件事。我啊我一点,然后的话呢,这个FILE1FILE to啊file三都可以传上去,同时还有它对应的描述,然后呢,我这一组大家看一下哈,哎。
16:04
我这一组对应着什么呀,对应着一条数据库记录是吧,所以说我得把这两个给它摘出来,而且的话呢,摘完之后啊,我得先验证,验证通过了,我才会把那个文件保存到服务器端的磁盘上,是这么一个步骤吧,所以说你怎么把这个数据摘出来呢?那于是我就为这个文件上传啊,定义了一个张阿斌,阿斌在这呢。Yes,在这呢啊,有ID,有file name,有fair pass,有fair Dis,那换句话说,我就得把两个fair item封装成一个fair upload的bin对象,哎,这一步干的就是这件事。
17:04
那创建fill upload b的集合由什么呀?由item创建,那光这个呢还不行,因为我这个我这个什么,我这个B里边啊,并没有对应的那个输输入流吧,我这个写完之后,我还得把那个文件传到把那个文件写到服务端的磁盘上吧,所以说的话呢,我们又搞了一个什么呀,我们又搞了一个呃,File。啊,Upload files这个见识路径值是fair item,实际上这个值是什么为好啊,是一个input stream是不是最直接啊,但是的话呢,我们这个里边是包含stream的,所以说啊,这块有一个构建的过程,好了,这个搞完之后的话,我们直接做到最后一步,我这一步就可以干什么了,我就可以进行文件的上传操作了,这个是比较简单,呃,找到文件的路径,找到输入流,直接进行文件的上传,这是一个纯IO操作。
18:10
好吧,大体步骤是这样,那最复杂的这个方法是怎么写的呢?在这。复杂一点。我们承认哈,这个复杂一点,那你也可以考虑其他的办法,你只要把这个需求实现就可以,我们怎么做的呢?我们是这么干的,我们讲了是吧,进来这个,嗯,一帮男生女生,我想给他们配对,说他们有这个恋人关系,怎么配呀,你随便拉过来一个男的一个女的说哎,你你俩是一对吗?这样排组合排列组合,一个一个去问的话,如果要是五个男生五个女生,你需要问多少次啊?很多次是吧,那我要把五个,把五个男生拉来,我就问这个男生,哎,哪个是你女朋友,是不是只只需要问四次就可以,四个搞定了,另外一个不就对得上了。
19:11
所以说我们先把什么呀,我们先把这个嗯,文本域拿过来啊,封装到这个map里边,这个feel name就那个DSC,我们是不是不是123做标记啊,OK,然后呢,呃,我们再找来这个文件语,然后从里边我们通过那个123找到对应的这个dic,于是封装成为这样的一个bin,放到这个集合里边就OK了,那这个呀,还有一个什么呀,这个啊upload files也是很容易放的,因为item有了,这个pass也有了,这不就行了。好了,这是我们昨天写的哈。
我来说两句