00:00
好,那下面呢,我们就来看一下咱们该如何来解决这个问题啊,然后咱们该如何解决呢?我刚才也跟大家说了,我们是需要在spring mvc的配置文件中去配置一个文件上传解析器的,那下面呢,咱们就来配置一下,找到咱们的spring VC点叉ML,然后咱们在这呢来配置一个文件上传解析器配置。配置文件上传解析器好,然后这东西大家注意,它其实就是一个B。然后它的类型是什么?叫做multi partver。大家注意这个东西,但是呢,大家看到它又是一个接口,那咱们能直接去用吗?不能,我们得去找到一个它的实现类。那这个实现类呢?然后是什么?咱们可以先把它给这个,先给它这个设置出来,然后下面呢,咱们来看一下CTRL加H,大家看一下它就两个实现类,那我们要用哪个叫做commons multi part reservever OK吧,行,然后下面咱们把它给改成是它的实现类啊,叫做commons,然后multi part reservever,然后设置完之后,那这里面有没有一些属性啊,有,比如说大家看defaultcoding,是来设置我们当前上传的文件时候的一个默认的编码的,比如说我们可以把它给设置,为什么叫做UTF杠八,OK,然后下面的呢,我们再来看,然后比如说这里面还有一些属性,比如说这个是来设置我们所上传的文件,它最大的一个大小的。
01:31
OK吧,然后叫max upload size,当然这个东西大家不需要去设置,因为它有默认池,你像上面咱们这个默认的编码,其实我们现在你看上传一个文件的话,咱们也是没有必要设置的,知道吧,但是呢,大家要知道它里面呢,确实是有一些属性的啊,好,然后呢,我们可以把它两个给干掉,然后我们再来测试一下吧,咱们重新部署,然后大家看啊,这个时候它就又有问题了,什么问题,我们连启动咱们都启动不起来,也就是说我们重新部署的过程他都会报错,大家看咱们往下走,你看直接就给咱们报了一个错,报什么错,他说叫java.long.class not found的exception什么意思,类未找到,那类位找到是因为什么?大家想一下,是不是就是因为我们当前咱们少价包,或者说你某个类你真的是没用,他才会报这个错的,他给我们报的是什么叫org点阿帕奇点comments.fill uplo.fair a factor。
02:32
这个大家见过没有啊,如果说大家学习过原生的solve中的文件上传的话,这个东西大家应该都用过,对不对?然后这个是我们的这个阿帕奇所开发的一个commons杠,Fill uplo的这个价包里面的内容。OK吧,好,首先啊,为什么咱们在当前咱们的这个重新部署的过程中,他就报错了,大家注意,那是因为我们当前咱们spring mvc的配置文件什么时候来解析的,大家想一下。
03:03
什么时候来解析的呀。啊,它是不是在我们的dispatch solve初始化的时候解析的,而我们在配置web叉ML的时候,咱们去注册dispatch of,咱们是不是把它的初始化时间提前到了服务器启动时。OK吧,然后所以说当我们的这个配置文件在服务器,我们的dispatch solve初始化,然后它是在服务器启动时,那也就是说咱们的配置文件在加载的时候,它是不是也是在服务器启动时,对不对?那所以当我们的配置文件被加载的时候,那这个并标签是不是就会直接被加载啊。对吧,有的老师为啥,因为咱们的病它有什么呀,叫做作用域对不对,然后它默认叫做singleton,叫做单利,咱们说过,当它的这个啊,如果说我们当前咱们的B的作用欲是单力的时候,它的初始化的过程,它的实例化的过程,然后是不是都会在咱们获取IOC容器的时候来执行。
04:02
对不对,好,然后呢,所以说大家注意,就在我们当前咱们的这个重新部署的时候,他就直接报错了。OK吧,行,然后下面呢,我们再来看,那这个错怎么解决,很简单,你把相对应的价包加上就行啊来我们现在咱们来找到咱们的文件上传功能,大家注意,就这个叫做commons-file upload啊来复制一下,然后把它给放到我们当前咱们的po点叉ML中。好,把它放到咱们的POM点叉L中,把它给放在这个位置,然后port的change色,OK,然后咱们现在把它给设置完之后,下面大家再来看,我在这咱们再来一个重新部署来,咱们给它清空一下,然后大家看看它能不能正常的重新部署啊,然后如果说可以重新部署,那说明咱们把这个价包加上之后,就能够来解决咱们之前报的那个错。之前报的那个缺少类那个错啊,我可没说过解决咱们那个空指针那个错,知道吧,好,下面大家看没问题,然后那我们现在咱们再来测试这个功能,大家看我现在来一个刷新,然后我来选择一个图片,然后咱们来点击这个上传,诶你会发现它咋的了,它又报了控制帧,而且还是咱们的第几行啊,第33行报的错,那大家说这个说明什么啊,你看他报的还是33行,说明咱们的photo获取到了没有,还是没有获取到,这说明啥?这说明你配了跟没有配饰一样的效果,对不对?那这个时候大家说我们我们能想到的是什么呀?我们说了咱们的文件上传必须得有文件上传解析器。
05:40
对不对,那我们配置完之后,但是你会发现spring VC在实现上传功能的时候,咱们配了跟没有配置一样的效果。对吧?那说明啥?那说明spring VC它在实现功能的时候,根本就没有获取到这个文件上传解析器,跟你没有配置是一样的效果嘛,对不对?那大家想,那我们的spring m VC在实现功能的时候,如果它要获取这个文件上传解析器,那这不就是一个B吗?咱们来获取B那不就两种方式吗?你要么根据class来获取,要么根据ID来获取,咱们的class绝对没有问题,但是现在SPAVC还是获取不到,说明什么?说明spring VC在获取它的时候,压根就不是通过类型来获取的,一定是通过ID来获取的,大家说是不是?
06:26
对吧,所以说大家看好这个地方,咱们的文件上传解析器,它的ID有一个固定的值,它必须得叫multi partver。能看懂吧,它必须得叫这个MU partver啊,然后下面我们在这咱们再来重新部署,大家看好一定不能忘了,然后这个东西也是咱们以后经常会用到的,因为在咱们的一个项目中,文件上传的功能是非常多的啊好。然后咱们把它给清空好,然后下面咱们再来一个刷新页面,好,然后咱们来选择一个图片,大家看啊,一点勾BG点击上传,你看这还报错,我报了我报了啊,所以说咱们现在这个问题就能解决了呗,大家记好啊,是为什么?是因为咱们报错报了三回,第一回是因为我们没有配置文件上传解析器。
07:15
第二回是我们少加包,然后第三回呢,是因为我们的并没有设置ID,大家想想是不是应该就是这样的一个过程,你配置了跟你没有配置一样的效果,那说明spring VC获取它的时候一定不是根据类型获取的,一定是根据它的ID获取的,对不对?好,它的ID必须要设置为milk part啊行,然后下面呢,我们再来看,你看这是不是就输出的一个内容叫做什么一点勾BG,这就是我们当前咱们在这所输出的一个内容叫做啊不是这个啊,应该是咱们的这个对吧,这就是我们输出的这个文件名,OK吧,所以说这个方法干啥的,来获取咱们上传的文件的文件名,OK。
08:01
那咱们现在文件名获取完之后,那下面大家说我们是不是就可以来干嘛了。来设置我们当前要上传的这个文件的位置了,对不对?好,然后呢,我们怎么办?咱们在这需要先来获取,咱们说了现在要上传到什么地方,因为我们没有专门的文件服务器,所以说咱们只能把它上传到咱们的Tom cat中,也就是我们当前的target下面的这一个袜包下面啊,好,然后来获取咱们的solve that context对象,然后是怎么获取的,叫做session点,然后get solve that context,好,获取完之后,咱们是不是就需要来获取这个路径了,比如说我们现在咱们把咱们所有的这个图片,然后全部都给它放到我们当前这个袜包下面的photo这个目录下,OK吧,来大家看啊,然后来获取什么,来获取咱们当前咱们的当前工程的真实路径,真实路径好怎么写solve context的点,然后get real pass。
09:07
叫做get real pass里面怎么写已经跟大家说过了啊,直接在这里面写个什么,或者说来获取当前工程下,当前工程下PH这个photo目录的真实路径怎么写呀?里面直接写个photo是不是就完事了呀?对不对,大家注意,这个是我们当前的photo pass OK。这是我们当前咱们的photo这个路径,但是大家说是不是有一种可能,就是我们当前咱们的这个挂包下面,它并没有photo这个路径。大家说是不是要不然我们就在这儿直接去创建一个photo,我们当前的工程中有photo,那我们当前咱们工程所打成的挂包里面也一定有photo,但是我们这个呢,是来实现一个文件上传的,所以说我们可以这样来进行操作,对吧?然后我们可以在这里面没有,但是咱们可以在这里面去创建一个怎么创建,比如说啊,然后我们现在呢,咱们这个来创建,然后咱们的p ho to叫做photo pass,然后所对应的文件对象,也就是file对象。
10:18
OK吧,怎么创建呀,然后fail,然后fail,然后等于new一个fail对吧,然后把谁放进去啊,把photo pass放进去,然后那我们现在创建完之后,大家说这个文件对象对应的不就是咱们的photo这个这个目录的路径嘛,对不对,所以说我们是不是就可以来判断,来大家看好来判断咱们的file所对应目录,所对应目录是否存在,是否存在,好,然后来if fair fair fair点叫做exit,这是不是就是否存在的意思,大家说这是不是存在的意思呀,这是不是存在的情况,那咱们在这加上一个叹号,这是不是不存在,不存在怎么办?直接fail.mkdr直接把这个目录创建出来。
11:07
能看懂吧,直接把这个目录创建出来啊,大家注意,为什么咱们要这样去做,因为我们现在是要把它给上传到这个位置下面的photo目录下,但是呢,我们现在呢,然后这个photo目录它有可能不存在,对吧?如果我们现在咱们当前的工程这个web APP下面有photo,那咱们在这也有,但是你看现在在这有吗?没有,当然我们完全可以在这去new一个photo目录,可不可以,也是可以的啊好,当然我们也可以这样去实现,然后我们先来确定它的目,它这个目录的位置,如果说不存在,咱们把它给创建出来也是可以的。好,OK,那这个路径有了,那我们现在咱们是不是就知道往哪传了呀,大家说你往哪传,大家在这咱们来设置一个string,叫做fial,叫做final pass,也就是我们当前最终咱们上传上传的这个路径怎么写,Photo pass是不是到哪了?这个路径到哪到我们当前的wa包下面的photo这个目录,然后再加上咱们当前文件的分隔符,然后再加上我们当前咱们所上传的这个文件的名字叫做file name就可以。
12:21
大家知道这个长什么样吗?前面是咱们当前的这个路径。然后斜线,然后斜线。Photo,然后再斜线加上咱们当前上传的这个文件的名字,咱们当前上传文件名字叫一点勾BG,那这个路径就是当前它的路径,加上斜线photo,然后再加上一点勾BG。能听懂吧,这就是我们上传的文件的路径啊,好,然后再往下,那我们现在咱们是不是就可以来实现文件上传了,来这个上传文件怎么上传看好拿着咱们的PH photo,我说过里面有一个什么叫做transfer to。
13:03
叫做transfer to transfer转换转移,然后转移到哪,转移到把我们当前photo所对应的文件转移到我们所指定的路径,OK吧,所以说那大家看你看这里面两个两个重载的方法,一个传进去的是fail对象,一个传进去的是pass对象,那pass咱没见过,那咱们就创建file呗,直接new一个file对吧,然后把我们当前最终要上传到的路径final pass放进来就行。因为它是涉及到咱们的文件上传,咱们说过文件上传就是文件的复制,文件的读和写,所以说在这咱们直接来把这个异常给他声明出去就可以啊,IO异常。没问题吧,大家注意,这个文件上传就已经实现了,那下面咱们在这重新部署。好,大家来看咱们当前这个效果啊,来把它给清空掉。
14:00
OK,然后下面我们在这咱们再来重新刷新一下,比如说我们现在咱们来选择一点勾BG,然后来点击上传,大家看,诶没报错对吧,那我们来这找一下,大家看一看photo有没有了,Photo是不是就有了呀,咱们点击右键叫做收银pro,在我们当前的目录中打开它,然后打开之后,然后我们把photo打开,大家看,这就是我们刚才所上传的这个图片,没问题吧。是不是,哎,大家注意啊,这就是我们刚才所上传的这个图片啊,行这个思路呢,大家一定要知道,其实它跟我们这个之前咱们solve里面原生的这个文件上传呀,它的思路是一模一样的。然后我们也是需要知道我们要把它上传到哪儿,然后呢,我们之前咱们在solve里面,那我们肯定做的这个过程比较的复杂,然后我们需要自己手动去干什么,咱们需要自己手动去这个啊,创建输入流,然后创建输出流,先读再写,把它进行复制,但是现在在我们的SPAVC里面,我们是不是直接用谁呀,直接用咱们的transfer to方法就可以直接实现上传,将咱们当前photo所对应的文件转移到我们当前所对应的这个位置,所指定的这个位置就可以了。
15:16
OK吧,行,这就是我们当前的文件上传功能啊,好。
我来说两句