00:00
下边这个地方,当用户选择一个文件之后,一点提交按钮就能发进流了,所以后台我要提供CTRL了,就处理了,所以下边就提供CTRL,提供CTRL,这个CTRL方法我就教他了,然后呢,这个地方来一个加一个CTRL,这个CTRL来一个返回值,返回什么类型的。想一想,你得有根据,你不能猜着。对,为啥熬不这个岛?提示他,我访问网页也可以提示他。返回什么,你看什么,从这个数据的格式上面,你看谁啊,是不是看请求啊,看谁发的请求,谁发的请求呢。你点这个提交按钮,谁发的请求?Form form表达发请求同步的还是异步的同步?同步请求是谁发的?
01:04
浏览器法,对浏览器发的响应性的浏览器,浏览器能解析数据,能解析啥数据?网页对网页嘛,对网页就是这,但不用不用怕知吧,你网只要符合我们的理论道,反正你你回答错了也不犯罪,知知道吧,这也不能把你怎么着,知道吧,所以你只要符合我们的理论,知道吧,就没啥怕知不管做到什么时候做开放,你都不用怕,只要记住我们的理论就行,按照理论去想,那这个地方按理说返回个网页,返回网页这个地方是按理说一个设是什么类型呢。对,返问网页,跳转网页是不是这样吧,跳转网你如果不不跳转不跳转,你自己返问网页太麻烦了,所以得跳转网页,跳转哪个网页,你得写一个什么,你你得创建一个网页,告诉这个这个上传成功的网页,如果失败了,还是写一个上传失败的网页,那你把这个网页的路径返回就型了,按理说这个是个类型了,知道吧,那按理说这个这spring类型string将来要返回成功或上传成功或失败的网页的那个路径。
02:10
但是我一会儿我为了测试一下,我还得写俩网页,所以我比较麻烦了,所以这个时候呢,我不准备返回网页了,不转返回网页,你返回什么,我就返回阶S自符串,诶你说老师不对呀,你前面发的同步就你返阶S多浏览器能解析吗?解析不了,解析不了你不为什么还返回它,我就返回它是吗?就反了,我就任性一把是吗?怎么任性我就我就不符合理论了,怎么不,那你说他浏览器解解析不了,我就让你们看一看浏览器发请求,我就给他返了一个杰森字符串,你看他能解析不?我举一个反例知吗?就让大家看一看,浏览器发同步请求,我就返回阶段自传,你看浏览器能解析吗?大家你以后写程序你别这么干,我这个是个返例啊,记住,我这个是返例同步请求,我偏偏给它返回一个阶层字符串,那返回阶层串这个定义什么好,我接克把我阶层字符串内容封装对象里边往回返就行了,好。
03:10
下边这个方向标知了这样就行了,好,然后呢,这个地方我这个是返利啊同步请求返回阶段自转,你看会出现什么效果,知道吧,好这时候我们这样,然后呢当家它这个CTRL这那这个加一个request么来品,然后呢给UR这个UR我和就和市场活动的那urr那些UR都保持一致了,然后呢这个activity,然后呢这个方号名这那个这住这行了,好,将来要返回接字符串加一个response。然后呢,前台这个地方是话,要定一个形参接收前台传输参数,那定义什么样的型存。那你看前台传什么参数,前台传什么参数。接这个一个文件是不是一个字符串啊,那先接收字符串好接收,先前好接收的接字符串,那是不是定义字符串啊,定义字符串去接收这个文件,怎么接收呢?定义什么类型呢。
04:14
啊。按理说定义流是吧,不是定义流,它这个定义什么呢?定义spring mvc专门给我们提供了一个什么一个类,用来接收客户端上传的文件。Spring MC自动给我们专门给我们提供一个类,这个类叫啥叫,这个类叫multi,叫multi part。Fire就这个类知道吧,Multi part就它这么一个类,这么一个类型的一个参数,定义它就行了,当然这个参数名肯定跟我们这个参数名保持一致啊。这样客户端发过来请求之后,他接收到之后,会自动的把请求体里边的那个文件封装到这个对象里边。
05:03
把那个文件里边所有的信息都会封装到这里边儿去。知道吗?都会封成这个对象,他怎么封装,这是框架的时候么?XC的时候我们不用管,你只需要定义这么一个行参,然后他就把那个文件里边所有的内容怎要封装这容他怎么封装,就是接springc会什么调用他的类到请求体里边去拿文件,去拿文件之后封装这个类。好,这个是这个,这个地方我给大家要强调一点,Spring MC怎么去到潜油体里边拿那个文件封装的这么一个对象,它其实调用了一个类。IC内部的一个类。通过那个类到请求里边去拿数据,让他放到这边。那一个类为什么跟大家强调这一点,就是因为那一个类呢,它一开始没有放到spring mvc或者叫spring的容器里边,所以他要调那个类的方法,你必须把那个对象创建好,让spring MC给你用,就去调去,如果你要不创建那个类。
06:06
那么SPA接收到请求之后,你这个定义好了,他也那个类它也掉不了,从请求体里边也拿不到数据封装去了。所以你必须给他创建一个对象。把那个类的对象给他创建好,告诉他你接收到上传的文件,你就调这个类的这个方法,然后呢,去拿文件封装成这个对象就行了。你必须给他创建那个对象,你说老师这犯难了是吧,什么人接到请求,他又不通知我,我我什么时候给他创建一个对象。你不用new,你干什么把那个对象呢?把那个类配置一个什么在spring,在spring或者spring这个MVC到那个配置文件里边,给他配置一个B服务器一启动spring或者spring mvc会自动的把那个对象了么,把那个类。初始化了,创建一个对象放到容器里边了,你只需要告诉什么M7,我那个什么创建好的那个对象,那个B呢?ID是什么,什么MC接收到请求之后上传文件,上传请求之后它会自动的找那个B去,找到之后它就掉重装了。
07:15
知道吧,所以你这个地方必须配置,这个地方必须配置,必须配置那个那个类,那个工具类,那个工具类是什么?一般来讲我们把它叫做spring mvc的,Spring mvc给我们提供的一个工具类,这个工具类我们一般来讲都叫springc的,叫文件上传解析器。上传解析器,你必须给他配置好它,如果不配置好它,SP接收到请求,他去找不到这个类的对象,他也不能去从请求这拿文件,然后封装去了。必须得配置它在哪个地方配置在spring m VC的配置文件里,配置哪个地方,在这个地方spring MC的配置文件来找一找,配置文件都在这边,在这里边配置spring MC的文件上传解析哪个地方,咱们就这个可能就它。
08:10
这个地方我们搭建开发环境,给他注释掉了,把它把它打开就行了,这是文件spring MC接收到文件上传的请求之后,它会自动的调查的一个对象,调查对象里边一个方法,然后呢,从请求组拿数据封装对象。这是我们这。这个地方给大家特别强调一点啊,这个ID值不能变,大小写都不能变,为什么不能变?你要如果变了边MC将来就找不到这个宾了,这是大家约定好的,是程序员跟SPAMVC框架约定好的,这个ID不能变,将来他要到容器里边去找这个宾,找到之后直接掉,你要变了它就找不着了。所以大小写都不能变这个ID好,这是我们说到这,还有大家看下边,你看它有俩参数是吧,你看这俩参数什么意思,第一个参数这是什么意思?对这个类它从请求题里边去拿数据的时候,拿文件的时候,它需要参照一个参数,这个参数啥意思,你看。
09:13
对,最大上传文件,那个文件不能无限大,是不是这样的,只能上传这么大,如果超过这个范围,他拿那个文件的时候,一发现太大了,他这个地方就给你报异常了,文件就上传不上去了,所以这个地方,我们这个地方,他这人配置这个文件多大,这是。对,它是以K为,它是以字节为单位,字节为单位这是不是80兆,80兆咱们那个是多少,咱们那个需求要求是多少,五兆是这改成什么五就行了,其实这个地方改不改无所谓了,诶你说为啥改不改无所谓,万一它上传很大呢,但你想在这个地方验证验证它的文件大小,它有意义吗?没意义了,为啥没意义了,对,文件都已经传到服务器了,你在这验证文件太文件太大了。
10:04
这没意义了,是是因为后台已经压力,已经造成压力了,所以你看,所以一般来讲文件大小是么,在前台一点什么,对一点提交的时候请求还没发了,在这个地方就验证它是不是太大了,所以他告我说说五兆在这个地方验证,所以这个地方改不改无所谓啊,你要改了那就改一下吧,知道吧。啊,这是我们说这下边这个编码,这个编码就好理解了,就是这个文件里边如果有一些有一些内容的话,用uta-八去解析这个好看好这个地方呢,我们就可以了,知道吗?好,这样的话,它这两个参数就定义好,定义好之后字符串复制到这里边,文件从请求里边拿出来,把所有的信息都放到这里边。下边我们就准备来写我们代码了。那其参数都拿到了,字符串和文件都拿到了,下边怎么办呢?下边写我们这个函数,在这个函数里边干什么?
11:01
那你想要干什么,假如说他提交了一个字符串,是不是你拿到字符串了,你就可以随便干了,干什么可以插入到数据库中,可以打到控制台随便了,但我这个地方给大家做演示的话,我就这样把字符串数据,把文本数据吧,把文本数据,然后呢,打印到什么,打印到控制台,打印一下,大家看一看,看控制台看能不能传过来,我这个主要是给大家演示一下,看这种文件上传的同时,能不能把这种字符串数据传过来,我就直接这么写了,打印一下就行了,当然你能打印,让你插入到数据库里边,调service也能插入到数据库里。我这个地方就直接打印去了,例子下边那把这个文件呢,把这个文件干什么呢。人家上传一个文件要传到服务器上边,是不是你在服务器上生成一个一模一样的文件,把这个文件内容写里边就行了,这样的话就相当于把用户电脑的文件传到服务器了,所以我们这把文件在服务器上,在服务器指定的目录吧,指定的目录中让它生成一个,生成一个同样的文件,这不就相当于文件传到服务器上了吗?那如何生成一个同样的文件呢?
12:21
他这个里边有个方法,在这个工具类里边有个方法,在他这个接收这个文件的这里边有个方法,这个方法我一写你就知道它是什么意思了,所以大家有有这种意识是吧,编程的意识就是什么,像踢足球都有什么足球意识,跑位意识是吧,就你编程也得有么编程的意识,你一看到这个方法,你一看到这个类,虽然没有人告诉你怎么写,你就有这种意识了,所以这种意识其实很值钱的。对你说这要为什么,他那踢踢足球的,你说他他进球多,他进球少知道吧,意识很重要,因为大家什么有的时候身体不重要,身体太再再撞是吧,没有意识乱跑是。
13:03
你跑一会儿就累了是吧?那你说他踢足球,你说像什么梅西,你说梅西强壮吗?梅西不强壮,是个还矮是吧,还还不强壮,比他强壮的人有的是,那为啥他进球多呢?那么他这种技术好,这个其实只技术好的人,比梅西好的人多的是,知道像什么像罗本之类的,我觉得都比梅西不次于他,盘在一些技术知吧,但是梅西为啥进球,进球多知吧,他意识好是么?意识就是意识很重要,就我们这编程的意识,你看我要什么,把这个文件里边内容是吧,然后生成一个什么,生成一个别的一个生成一个什么,在文件上面生成一个文件是吧,他什么找谁。你肯定找这个类,因为什么,因为文件都在这里边呢,所以找他当然也有可能掉别的工具类,那别的工具类现在我不知道不知道,我去看看闯闯运气,它里边有没有,就像踢球是吧,我站到这个地方有没有机会,我不知道不知道,我跑一下试试,这是一个空荡荡,所以但你看你点它的,它里边有个方法,哪一个方法叫这个啊这个。
14:10
你一看行大卡你就知道怎么用了,这是什么意思,你看transfer什么意思?Transfer什么意思?翻译成中文什么意思?转换是吧,转换to叫什么?转换到把你这个文件转换到,转换到哪里边,让你传个参数这个F,你猜猜这个F是干什么的。对,转换到哪个文件里边,你这个地方是吧,哪一个文件,你就把那个文件生成一个对象传给他就行了,它就会自动转过去了。知道吧,所以下边我就什么生成这么一个文件,一个对象生成文件对象是不是直接new啊new new的话,New的时候你要指定这个文件放到哪个地方,把那个路径写到这儿,那我要写到哪个地方呢。他要上传了,上传假如说我就放到服务器上,那我就放到这里边,然后呢,直接放到服务器这个目录里边,知道吧,这个文件名叫啥呢?随便叫爱叫啥叫啥,那我这个地方假如叫AA吧,随便叫,然后呢点上传来是X2L文件,我就叫XLS了,后缀名。
15:16
大家这个地方需要大家注意的是,这个路径必须手动创建好,必须引擎加的这个路径,路径必须手动创建,必须手动创建好,然后呢,文件可以不存在,文件可以,文件如果不存在,不存在然会自动创建会。自动创建。路径必须创建好,如果路径都不存在,它就给你报错了,然后定一个变量来接收,然后呢F,所以这是我们说的这样,然后呢,大那这个地方他肯定要写文件,肯定要报ioe程了,报ioe程我测试程序我就不管了,直接往外抛就行,然后呢,Ex except行了,好这样的话我们就可以了,是可以完了之后呢,大哥,那这样的话,一调这个方法,它会自动的把这里边这个文件转到这个文件里边,这个文件不存在,新创建一个要把里边内容写里边。
16:17
No。好,这样的话我们就可以了,可以完了之后都处理完了,下边返回响应信息,响应信息知道吧,那返回响应信息,根据咱们的设计,返回一个杰森,我们说这是个返利,那返回个杰森,那返问哪个杰森,我就返回咱们那个叫return object,杰口导哈六一个return object,你说成功了是我不管成功还是失败,我因为我做测试,我不考虑那么多,所以我就返一个杰森字符串,就让大家看一看,返回个杰森字符串同步请求返回阶段字符串到底可不可以,假如我就成功了,然后呢来一个,然后呢,Message来一个。上传成功好,然后呢,直接把这个对象上就行,好,这样的话不就可以了,这个CTRLL我就行了。
17:08
好,那这样的话,那我们知道CTRLL写了它这个ul还得拷过去拷到哪了。拷到这边来,这个幺二再拷到这了,这样我们就可以了,这样的话,我们这个例子前台后台都写完了,下边就可以测一测了,看看能不能上传上去,所以下边我们主任。
我来说两句