00:00
好,那下面呢,我们再把咱们的代码呢给改正过来,首先这个地方咱们需要来返回的,大家注意啊,把下面这个输出的这一句话给它干掉,然后呢,我们现在呢,咱们把这个注释呢,也给它取消掉,对吧?因为我们现在咱们已经来获取了谁了,已经来获取了我们要下载的这个文件,它在服务器中的路径,对吧?因为我们现在咱们没有专门的这个服务,这个文件服务器,所以说我们只能把只能下载这个文件从哪下载,从我们当前咱们的web服务器中去下载,OK吧,行,然后下面大家再来看,然后我们当前咱们的方法的返回值,然后是属于SPNT,然后它是有一个泛型的,这个泛型来表示的是什么,就是我们当前咱们要响应到我们的浏览器中的数据的类型。大家看你看我们设置的是什么叫做BAT类型的数组,就是字节嘛,对不对,然后呢,我们现在是要把什么给响应到浏览器的,要把我们所下载的这个文件给响应到浏览器,那所以说大家想想,我们是不是只需要把我们这个文件的文件所有的字节给它响应到浏览器,就可以实现一个下载的功能,OK吧,所以大家再看,你看咱们下面干什么了,创建了一个输入流,然后把我们当前咱们的这一个要下载的文件的路径给放进去,然后这个时候咱们的这个输入流来读取的是不是就是我们当前咱们的一点勾BG对吧,这个地方没有啊,是因为这个是我们之后咱们要复制进去的,大家可以这样来,咱们现在来找到咱们的这个工程。
01:35
来找到咱们的这个阿贾克斯,然后找到life circle,然后咱们先清理一下。好大家看,然后下面我们在这咱们再重新打包,然后这个时候咱们的target下面就有了啊。OK,然后大家看这个时候他给的下面这是不是就有咱们当前要下载的这张图片了,对不对,所以说我们现在已经知道了它的路径了,那我们是不是就可以来实现下载了,对不对?然后我们先创建一个输入流,然后呢,创建完输入流之后,然后我们去创建了一个BAT类型的数组,然后大家看叫做be,然后new bet这括号里面是不是要写长度呀,但是这个东西你看这是啥意思,叫做is.available不知道这个方法大家学过没有,这个东西是干什么的啊?然后是来获取我们当前这个字节输入流所对应的文件所有的字节数。
02:32
能听懂吗?好,什么意思?也就是说我当前我这个文件有多少个字节,我当前的数组就创建多少个字节,因为我们现在咱们是要把咱们当前这个文件所对应的所有的字节一次性响应到浏览器的,所以说我们现在是不是就要把咱们当前这个文件所对应的字节全部都读到咱们的这个数组中,所以咱们的长度是怎么了,咱们数组的长度是怎么来设置的,你这个文件里面有几个字节,咱们的数组,然后咱们就设置为多,设置为多少个长度,能听懂吧,所以大家注意,然后在这咱们的is.available然后这个是用来获取谁来获取咱们的输入流,然后所对应文件的字节数,字节数这个大家注意啊,好,然后下面呢,我们是不是就可以把我们当前的这一个输入流所对应的文件,所有的字节都读到我们当前的数组中?
03:30
对吧?好,那所以这个时候大家说我们的什么就有了,咱们的响应体是不是就有了,然后我们要响应到浏览器的这个文件所对应的所有的字节就有了,那下面呢,我们是不是把这个对象是不是给它创建出来就行,然后这个对象要怎么创建呢?刚才已经跟大家看过了,首先咱们需要来设置它的响应体,要设置它的响应头,还要设置它的响应状态码,比如说这个就是我们要响应到浏览器的响应体,就是我们当前文件所对应的字节,对吧?然后第二个我们需要来设置响应头,怎么来设置响应头呢?大家看你看这个地方对吧,咱们在这是不是来创建了一个什么叫做multi part,叫做multi value map。
04:16
这东西它就是一个map集合,知道吧,好,然后这是一个什么,大家看,你看鼠标放上去之后,这是不是一个接口啊,你看它继承了map对不对,因为咱们的响应头也好,请求图也好,其实它的本质呀,都是键值,对,所以我们在Java代码中,咱们要想来获取请求头,或者说咱们要来设置响应头,咱们是不是也使用的是咱们的键值度的方式,所以说在这大家看好我们直接来设置一个什么呀,设置一个这个multi value map。然后这个东西它的本质就是一个map集合。我们在这里面来所设置的键值,对,就是我们要响应到浏览器的响应头,OK吧,好,那我们去找到它所对应的这个实现类,然后这个httb head就是它对应的这个实现类啊,好,然后再往下大家看,然后咱们往咱们的这个head里面去放值,因为咱们说了它的本质就是map,所以说咱们往里面去放键值,对,然后这个键叫做content disposition。
05:18
认识不应该是认识的吧,如果大家学习过solve里面原声的下载,大家应该认识,或者说呢,大家如果学过其他的下载方式,然后大家一定知道这个东西是干什么的,来设置我们当前的下载方式的。对吧,然后这前面这个键大家注意,它是固定的,你不能随便乱改,但是它不区分大小写对吧?就像是我们之前咱们在获取咱们的那个叫做re referee这个请求头信息的时候,咱们说了头信息它是不区分大小写的,你设置为大写也行,设置为小写也行,知道吗?这个是用来设置咱们当前下载文件的这个下载方式的,然后这个后边这个值大家看好这前面啊,这从这到这个位置,这这这都是固定格式,只有后边这个一点勾PG你可以去改,知道吧?好,大家看这是什么,这是以附件的方式来进行下载,然后这个file name来表示我们下载下来的文件默认的名字。
06:18
大家看啊,这是我这是来设置我们当前所下载的文件的默认的名字,比如说咱们下载的文件就叫一点勾BG,那咱们下载下来之后也叫一点勾BGOK吧,大家想,不管我们从哪去下载一个文件,然后我们下载下来的这个文件是不是都会有一个默认的名字,而这个就是来设置它默认的名字的,而前面这个是来设置咱们的下载方式的。这个大家能听懂吧,好,OK,行,然后那我们现在把这个设置完之后,然后下面大家再来看,那我们请响应头就有了,最后咱们是不是说了还要再设置一个响应状态码,叫做http status。然后这个东西咱们从这来访问,直接从咱们的http statuss从这个里面来访问就行,这就是一个枚举,然后里面把咱们常见的这些状态码,然后都给我们列出来了,比如说然后咱们常见的有OK对不对,然后呢,你看这里面很多很多啊,然后当然呢,还有对吧,然后这个啊,像什么404对不对,400,然后403,然后404对吧,然后还有呢,405对不对,406,还有咱们常见的这个什么,这个叫做500,大家注意这里面都有知道吧,哎,行啊好,那我们现在咱们肯定要把它给设置为200啊,因为200表示的是当前的这个请求处理成功,咱们响应到浏览器的状态码是成功,对不对,所以说咱们设置一个点OK,其实就是200啊。
07:52
好,当我们把这三个数据都设置完成之后,那我们就可以通过咱们的响应题,还有咱们的响应头,还有我们当前的响应状态码,然后来创建一个response nt对象,咱们最终直接把这个对象呢返回就可以,OK吧,好,然后这个时候我们就可以来设置我们响应到浏览器的响应报文,响应体就是我们当前这个文件所对应的字节,而响应头就是我们在这设置的下载方式,还有一个就是咱们的响应状态码,就是200。
08:24
OK,大家注意,这个就写完了,所以说如果我们要去下载其他文件的话,这里面只有什么不一样,就是我们当前要下载的这个文件的路径不一样,大家要知道不管是文件上传还是下载,其实都是文件复制的过程,OK吧,行来下面呢,我们就可以重新部署,然后咱们来测试一下这个功能啊。好,然后我们现在咱们来一个刷新,来一个刷新完了对吧,然后这个应该又是咱们的I idea出现问题了,对不对,你看我们下面咱在这给咱们这个提示出来的信息,是不是应该是这个重新部署成功了,对吧,咱们再来刷新一次啊啊可以了,对吧?好,下面呢,我们在这来点击下载图片,大家看好,我们点击之后大家看那这个图片是不是就下载下来了,然后我们现在咱们点击你看这个图片是可以直接来进行访问的,OK吧,哎,行啊好,那这就是我们当前咱们来使用spring VC,然后来实现的文件下载功能,大家可以把这段代码给保存一下。
09:30
然后呢,把它作为一个模板,然后我们以后咱们要去下载什么文件,大家只要把咱们要下载的文件的路径给改一下就行,能听懂吧,好啊,行,这就是我们当前spring VC,然后来实现的一个下载功能,好,那下面呢,我们再来看一下它所实现的这个上传功能啊。
我来说两句