00:00
好,那下面呢,我们就来实现一个文件上传功能,那首先呢,咱们先在页面中把咱们的这一个准备工作给做好,首先呢大家注意,然后呢,我们要实现上传功能啊,那我们当前就必须要有什么,必须要有表单,然后呢表单中必须要有文件域。这个大家应该都知道什么意思吧,叫做文件域,叫做type,等于file,它是可以帮助我们来实现一个文件上传的,OK吧,行,然后呢,大家看我们现在咱们设置一个form,然后这个action的话,然后咱们需要来让咱们的c Li进行渲染,对吧?好,然后斜线叫啥叫test,斜线up OK,然后在这咱们再设置一个请求方式,大家注意啊,咱们的文件上传,然后这个表单它是有要求的,这个请求方式必须为POS的,它不能为get,好还有呢,就是咱们的在这还需要再设置一个属性,叫做n tap,叫做n tap,来设置我们当前浏览器向服务器传输这个请求参数的这个方式,然后比如说默认值呀,是application。
01:08
Application斜线X-WWW-form-URL in cody的默认值是这个,然后我们现在要想来实现文件上传的话,咱们必须要来使用它。必须要把这个属性的值设置为它,这什么意思呢?就是将我们当前表单中的数据以二进制的方式提交到服务器中,然后这个时候呢,咱们才可以来实现一个文件上传。不知道大家还记不记得,如果你设置为它这个时候你传进去得,你传到服务器中的只有这个数据。然后它是没有这个文件的,所以说我们现在就需要通过谁呀,通过multi park杠杠data。然后以二进制的方式,然后来传输我们当前的这个数据,OK吧,行好,然后这个大家注意,这是我们文件上传的这两个条件啊,咱们可以把它给写到这个位置,然后叫做文件上传,文件上传的要求对吧?首先第一个要求请求方式啊,咱们的form form表单的请求方式,然后必须为什么叫做post,然后第二个大家注意,就是我们的form表单,然后必须来设置属性,然后叫做n type-form杠啊n type等于MU7PART-form-data啊行,这个大家注意,好,那下面呢,我们再往下看,然后在这呢,我们是不是还需要再来设置一个叫做叫做文件域,然后叫file file大家注意啊,然后这个name呢,比如说咱们现在来上传一个图片,然后叫P,叫做photo。
02:49
OK,然后咱们在这加上一个换行,比如说咱们前面来写一个叫做头像对不对,然后再往下,然后咱们在这再写一个提交按钮就可以啊,然后叫做submit行,OK,然后给他一个value,然后叫做上传。
03:07
OK,好,那我们把这个设置完之后,那我们就可以在我们当前的控制层中,然后来处理这个请求了,叫做request mapping,然后呢,叫做斜线test,斜线up,然后public来创建这个方法,那这个时候咱们怎么办?比如说我们上传成功之后,然后咱们就给它跳转到success。HTMLOK吧,行,然后在这呢,大家看好,然后咱们就叫做叫做test up吧,OK,然后大括号,然后我们现在要做什么,大家注意啊,然后我们现在要来实现的功能啊,就是把我们当前的这个文件呢来实现上传,然后上传到哪呢?上传的比如说我们现在没有一个具体的什么呢?没有一个具体的这个文件服务器,那咱们还是把它给上传到咱们的tomca的服务器中,外部服务器中OK吧,所以说我们现在也是需要来获取我们当前这个工程它在服务器中的一个路径的,也就是咱们的target下面的它的路径,所以说我们是不是也需要来sus,咱们先把它写出来啊,好,这个时候咱们是不是也需要一个TT PH session,然后session,然后来获得咱们的solve context,再通过solve context来获取咱们当前这个我们要上传的这一个目录,它的一个真实路径。
04:29
OK吧,行好,那下面呢,我们再来看,那我们现在咱们来点击,比如说啊,咱们这样,我们现在来来重新部署一下,然后我们去点击了这个上传这个按钮之后,比如说咱们选择了一个文件,来大家看我们现在来一个刷新,然后咱们来选择文件,对吧?然后我们还拿着咱们的上硅谷壁纸呢,然后咱们来进行上传,比如说我选择这个一点勾BG,然后我现在来点击上传,你看它跳到这儿了,对吧?然后我们现在要做的事情是什么,大家想一下。
05:03
然后是不是应该是在我们当前的控制器方法中来获得我们当前要上传的这个文件,然后获得完之后,那我们不就可以通过输入流来读取它,然后读完之后,然后咱们再通过输出流把它给输出到指定位置就行,这能听懂吧?好OK,那下面呢,我们来看,那在这呢,我们该如何来获取这个文件呢?大家注意,非常简单,在我们的SPVC中,它把我们所上传的文件给封装成了什么呀?给封装成了一个multi part field对象,来看一下啊,叫做multi part对象。就这个对象,然后这个就是我们SPAVC中,然后封装咱们的这个上传的文件的一个对象,叫做multi part file,然后咱们在这该怎么获取,很简单啊,就跟咱们平常获取请求参数一样,比如说我们在这咱们所上传的这个文件,然后它的name叫photo,那我们在这呢,咱们也得叫什么,大家注意,你也得叫PH to PH to叫做photo OK吧,这个时候才表示的是我们来获取的是咱们上传的这一个文件,上传的这个input所对应的文件,OK吧,行,这个大家注意啊,好,那这个对象中我们都可以干什么呢?大家看你看photo,然后里面是不是会有很多个方法,比如说看好啊,这个transfer to,大家注意,这个方法就是我们来实现上传的方法,也就是说SP微C呢,把咱们文件复制的这个过程呢,直接给我们封装了,我们还需不需要干嘛了,需不需要手动的先进行读,读完之后再写啊。
06:39
来进行一个文件复制,不需要咱们在这直接通过transfer to就可以将咱们photo所对应的这个文件,直接把它上传到我们所指定的这个文件所对应的位置,或者说指定的这个路径所对应的位置,OK吧,好,大家再来看这个地方干什么的,Get original file name来获取文件名的,这个是用来获取谁的?大家看,这个叫get name,啥叫get name,获取的就是我们当前咱们所上传的这个文件的这个文件域的内幕属性值,其实也是photo。
07:12
所以这个咱们用的到不多,大家看啊,这个get name咱们用的倒不多,但是咱们的get original file name这个东西咱们用的是非常非常多的。这是干啥的?来获取我们所上传的文件的文件名?OK吧,为什么咱们要获取文件名,大家想想,因为我们现在咱们是不是要来进行一个文件复制,文件复制的话,咱们就要先读,然后再写,那我们要,那所以说咱们这里面肯定有个步骤是要输出的,那我们要输出,咱们是不是就一定要来给他找到一个指定的输出位置。对吧,而我们输出的时候,你并不能给它指定它要输出的目录,我们应该来指定的是你要把它输出到哪个文件中。OK吧,所以说呢,咱们是不是肯定要知道这个文件叫什么,你输出之后这个文件叫什么对吧?你输出之后这个文件的后缀是什么,咱们是不是一定要知道啊,对不对,因为后缀来表示的是一个文件的类型,你能不能说你上传的叫做1.obg对吧,结果我输出之后叫做一点对吧?MP3行不行,肯定不行啊,所以说咱们在这一定要获取这个文件名。
08:23
好,大家看好,咱们就叫做fair name,行啊,好,咱们可以输出一下,So,然后在这是fair name,好,但是它能输出吗?大家注意它不能输出,为什么呢?因为我们现在咱们要想干嘛呢?咱们要想在这来实现一个文件上传的功能,我们在spring mvc的配置文件中其实是少一个配置的。OK吧,是少一个配置的啊,什么配置,因为我们现在咱们是需要把咱们的这个文件呀,因为Java中的文件只有file类型,对不对,我们现在咱们是不是有一个过程,要把我们所上传的这个文件给它封装成mut part file,所以说这个时候咱们就需要有什么呀,需要有SPVC里面的组件的支持。
09:09
OK吧,叫做文件上传解析器,所以说这个时候咱们是没有办法直接然后来获取我们的multi part file对象的啊,来下面大家看一下,然后咱们来把下面这个给它清空掉,然后我们现在咱们来访问咱们的首页啊,等会儿啊。访问首页。首页啊,来再重新部署一下啊。行。好。先咱们看一下重新部署行不行,你看他不行了对吧,然后在这给咱们报错了对不对,然后大家看一下啊,而且他报的错是什么的错,他报的错是不是应该是咱们当前的这个tomcat里面是个生命周期的一个异常,那所以说啊,遇到这个错之前也跟大家说过对吧,然后特别是你你咱们看这个代码,它是没有任何问题的,对吧,然后但是他现在呢,却出现了问题,这个时候怎么办?然后我们在这咱们直接重新启动就行啊。
10:19
好,然后至于我刚才跟大家说的,我说在这咱们是没有办法直接将这个文件给转换成我们当前咱们的一个MU part file对象的啊,然后这个错呢,是需要我们去访问才会有的,知道吧,好,来大家看,你看这是没有任何问题的,对不对,然后我们现在咱们来选择一个文件,一点勾BG,然后咱们点击上传,大家看,直接就报错了。看到没有,你看他直接报错报什么,错报的是控指针,然后在哪报的控指针,然后看一下在我们的33行报的控指针,33行,这不是33行吗?那这里面的空指针大家说应该是谁啊,那肯定就是photo嘛,对不对,那所以我们在这咱们有没有获取我们当前的这个对象啊,咱们的咱们所上传的这个文件有没有获取到啊,没有获取到,所以说我们是需要在SPAVC中去配置一个这个文件上传解析器,将我们当前上传的文件给转换为multi part field OK吧,行,下面咱们就来看一下该如何解决这个问题啊。
我来说两句