00:00
好了,来写吧。打开这个来写吧。说实话,怎么写这家班拿回来怎么写,怎么用,不知道。那怎么办呢?不用担心,我们来找啊,找什么?找他的帮助文档。呀,都退回来了。还得到comments下啊。Comments下。找到我们的feello。看这有个user。Guide用户向导。那么这里边儿有怎么样使用。这个file upload这个工具。它里边给我们示例了。这些内容我就不带着大家读了,我们直接看这个例子啊,他教我们用的例子。
01:04
首先看第一步,这这开始有代码了啊。Passing the request解析请求。什么意思?我们要文件上传,要实现文件上传必须是的请求。所以他首先。做了这样一个工作。这干嘛的?导入。就是判断这个请求是否是帕的请求。那我这儿就不这样写了啊,我这怎么写呢,我这样。If。如果他不是猫的请求。
02:02
对吧,我加了个飞呀,这个方法啊是如果他是猫派的请求,返回知识处,如果不是猫派的请求。那返回值是false,那现在呢,如果他不是multi的请求怎么样,你不是multi派的请求,你肯定不能做上传呢。也就是说,什么就是帕的请求了。我们之前说过了呀,只要他加着这个东西呢,它就是个求啊好,所以这个呢。判断请求是否为multi。Part。请求,那如果不是呢,不是我给他抛出一个。异常。我趴在。
03:00
怕个什么?呃,运行是以上run time exception。当前请求支持。啊,文件上传OK。那我们知道。呃,如果你不是了,直接就抛出异常了,抛出异常这后边是不是就不再执行了,对不对,当然了,为了增加可读性,我们一般啊会给它加上个瑞瑞。Return,你要它这个还对,这这抛出异常了,这这代码是没办法执行到的啊,你看看是不是这还真不能加return,因为这是什么through抛异常的,你看uncatable code,所以这还真不能加啊好,那也就是说我能执行到下边就说明他肯定是猫叉的请求了,对不对?好了,第一步搞定了。
04:29
这是第一步啊。写上。再往下。往下看。The simple list case最简单的场景情况怎么用呢?他说,啊,The simple usage,最简单的用法。S是吧。
05:03
SC这个这个单词读起来很很绕嘴啊,它它是什么意思,它是这个方案,它是方案的意思啊,就最简单的用法,方案是下边,呃,下边这个我就不读了,看在这handling the request处理请求in this,以这种方案来处理。Couldn't be much simpler,其实也不是特别简单的啊,也不是特别简单的,他这样说的,你看着。首先他这写了。创建一个工厂对什么磁盘,Based file item。这干嘛的,这个空上我先把它拷贝过来,这个代码我拷贝过来。
06:09
这是个item fire item是什么东西啊?Fire item记不记得?我们在解析,在给大家解析这个multipart form data这格式的时候,说每一个表单项是一个什么东西,是一个item。就是一个file item。那么这个工厂。这个工厂创建一个。File item。工厂,这工厂是干嘛的,要解释清清楚,他啊,还不是特别容易,我们看一下这你看啊,他要说。上传item是吧,上传那个部分呢,那个那个条目啊是吧,Should be。
07:09
Return。In memory as long as they are reasonable small,这什么意思啊,上传的这个这个像啊,应该被保存在。是吧,被保存的内存。只要他们。足够的小,它就会存到内存。再看这呢,Large it,较大的it should be。Should be,这个written。Toa temp,这是temporary是吧?Temporary temporary fair on disk。
08:01
较大的像应该被写到哪儿?临时文件,磁盘上的临时文件看到了吗?所以他这啊,他创建的这个东西,Dis file item factory,就是他创建这个东西,你不是你不是把这个。把这个数据上传到了服务器了吗?什么叫上传到服务器了?你注意他会把这个内容上传到服务器的一个临时文件里边。当然如果这个文件啊,如果你上传的数据它比较小,它就不往硬盘写了,如果比较大,它会写到硬盘。所以这就是。它的作用啊,这个工厂的作用是干嘛的,要把那些数据给它写到磁盘上,或者存到内存里边。你看这儿还有。Very large upload request should not be。
09:06
Permitted。非常大的。上传请求。不应该被的禁止啊,不应该禁止。也就是说这里边儿的东西啊,它和这个磁盘有关系,和临时目录有关系,所以它这这个叫disk file item factory,我们先创建这样一个工厂,紧接着这个东西我们现在先不管它。他这说了,他说这个东西啊,并不是很简单,他给我们现在这个例子啊,也不是最简单的例子,我们先来写一个最简单的例子。我们先不写它,我们看这这干嘛的,创建一个file upload handler,这是创建一个文件上传处理器,文件上传处理器,这是文件上传的核心组件。
10:12
写吧,一句一句写。创建文件上传核心。组件。你看看他的参数是谁,就是一个工厂。它的参数就是这个工厂。好,继续这个核心组件有了再往下这干嘛的。Pass the request解析请求拷贝。解析请求。
11:06
这有什么?The method他。诶,他这要什么的,你看看他这要的是。Request content。恩。Conest in the。啊,Upload upload,我们看看这个upload。Solid upload。Tomcat。
12:01
我们看一下啊,我们看一下。家把我们放进来了。这怎么都是Tom cat里边的是吧,删掉。啊,这一倒过来。我们看这。他这个价包我感觉怎么不对呢。要家暴?我们看一下啊,因为这这倒的都是什么,都是Tom k里边的,它这个里边的。过来了是吧,Commons下啊,你注意commons下。
13:03
这钱包下边。哎呀,同志们呐,犯了个错误,我们直接把这个zip文件放里边,我说这个价包怎么不对呀,是不是。这不是家暴啊,我们是不是需要把它?拿出来呀。是不是我说这个一直倒在这架包是不对的啊,阿lo的和IO的是不是这个。是不是这个。好了。要点热量啊,扛着睡。删掉。OK,这次就没问题了,删掉。
14:03
哎,你看这这次让我们选择了吧,这是Tom,我们不能用它呀,用谁common下边的啊。一样都是comments下边的comments。好了,这就没问题了。他这是什么?有异常,是不是有异常,有异常没关系啊,有异常我们把它整体。给它拆开去好了,现在这是什么解析请求是吧,获取到所有的什么。Item。所有的这个multi partt多部分是吧,每一个部分我都获取到了。
15:08
这是个什么,这是个list,那下一步我们猜也能猜出来,肯定是不是我要遍历这个item啊,对不对,下边要便利。继续往后看啊,继续往后看。刚才不是写到这儿了吗?再往下。这是练习更多的控制,对不对?练习更多的控制。啊,仍然是这个工厂啊什么,我们现在不用管它了。我们现在。干嘛呢,是这个。解析apload it。往下看,哎,这。这什么处理lo的这样这样这样获取一个什么。
16:03
It是不是迭代器啊?啊,它通过迭代器迭代的,可以,我们也可以通过什么for循环都行,用什么都行是吧。那么我们这样吧。我们用,我们不用它那个。感觉比较舒服一些是吧?这不是item吗?Item。紧接着该干嘛了,看他。他这写的什么?Item is firm?Field,这是什么意思啊?Process else process是什么意思?不知道不知道,我们就要查看API了。我们要查看API。
17:01
查看API这样啊,我们。再来一个。API在哪呢?在这呢啊,Java do。诶,是不是这个东西。找file upload。File item有没有,这是个什么接口,打开它,我们查看一下它的API,它的API刚才我们说了,这里边儿人家写的,人家给我们写的代码是什么呀?Is firm field,这是这是什么意思啊?找is firm field,诶是不是这个。Determines whether or not a file item。Instance。确定是吧,啊抉择什么。啊。
18:00
这个file item实例。Represents a simple form field。这是什么?这是呈现表现是吧,为一个简单的。Field,它这个是什么意思呢?判断我们的这个f item实例是否为一个。普通的表单项,什么叫普通表单项?只要不是文件上传的那个file,它就是一个普通表单项,你想我们刚才写的那个name是吧?我们这里边它就是普通表干相,它也是普通表干相,但他就不是。明白吧?呃,如果它是普通表单项返回值就是。否则就是false,所以它这里边儿给我们写了这样一句话,如果item是普通表单项,它是怎么怎么样。
19:06
否则呢,否则就不是表普通表白箱啊,我们要梳理什么文件上传。好。写,继续写啊,我们也来写if item.is from field。若。Item为普通表单项,对吧,L。说item为什么文件表单项对不对?你如果是普通表单项会干嘛呢?继续往后看,继续往后看,他这写了这样一个东西,这是他自己定义一个方法。
20:04
这个方法具体的内容在这儿呢,你看。具体内容是什么啊?具体内容这啊,如果它是普通表单项怎么样?item.get fill name。item.get string,这又是干嘛的?它是给了一个name,一个诶普通表单项它是不是有。Name。和Y6啊,是不是有值有名称和值啊,这是也就是说我们猜测的话,这是不是获取那个表单名称,这是获取表单的值啊。看一下API。Get full name。这个吧,Returns the name of the field in the multi。这是corresponding to the。
21:05
To this file item。这是返回这个field的名称是吧,在什么?的表单里边是不是。这是。和什么相关的吧,和这个file item是不是相关的。这个表单的表单项的名称再看。这个干了是谁?返回the contents of the。File item,返回这个file item的名称。以什么以字符串的形式?返回。返回内不是名称啊,内容返回这个的内容,内容就是它的值啊,所以我们就可以这样来写了。
22:01
啊,我这。item.get file name,这个我就叫file name item.get string。Value。是吧?这样吧,Fair value fair fair value。这是什么?获取表单项名称获取表单项。是值这样,我们这个就给它输出一下就行了啊。Found the name。
23:11
Failed。完了。诶,这写错了是吧。Fair value。OK。这是我们是不是对于。普通表单项的。获取啊,它的处理。那如果是文件上传的呢?那这个就稍微有点麻烦了啊,稍微有点麻烦了,我们继续来看。哎,这是处理,你看这写的处理是不是有规则的,就是那普通的表单项是吧,这是处理。
24:02
文件上传。Get是吧,Get,诶这有个get,这是什么。文件名,诶,我们这儿可以获取到文件名,对不对,这儿可以获取到文件名。获取文件名,那能够做什么工作呢?获取到文件名,具体可以做什么呢?我们来写。item.get。Get name。通过这个叫file name获取。
25:01
上传文件。这是它的原始名称吧,对不对。啊,我现在想做什么呢,想给他。想给他真正这一次啊,实现这种另存。想实现这个另存,想实现这个另存,我们就得获取到它的流里边的数据,所以这里边啊,看看它有没有获取那个流,获取流看看有没有。这好像没写,是不是要不好办了呀?查看API,看有没有。Get,这输出流。诶,这是不是有输入流。是不是input stream对不对,所以我们这item.get input stream s。
26:01
Is,那你想一下啊,我们现在要把它写到哪,写到一个输出流里边,那我这。就得来一个。文件输出流。是不是这是文件呢,对不对,那我就out。STEM。OS。嗯,我new一个。哎。Fair。Output。当然这是我的目标文件,这是我的目标文件啊,现在有没有没有没有创建一个。要它这字符串了,我们要的是什么fair啊。
27:04
我利用一个。然后另一个file,这里边得有什么,有文件名。有。文件名我们有了,我们就用它原来的名称是吧,关键还得有保存文件的路径啊。对不对。这路径有没有?File name。Pass,现在没有没有,我们给他创建一个。哎呀,这个pass你注意啊,我们对于web项目里边这个pass,你千万不要给他写成什么。本地文件系统里边什么D盘呢,C盘呐,E盘呢,什么什么不要写成这种。
28:00
也就是说你不要说我存存到哪,存到D盘下边的啊,比如这个这个images下边不要这样写,为什么?因为很多情况下啊,我们当前这个外部应用是不具有操作本地。文件目录的权限的。所以我们不要这样写,那怎么办?我存到这儿。这不是上传嘛,你上传到服务器,我就存到服务器。里边。有一个文件夹,我叫images,这可以吧?对不对。那这个images的路径怎么获取?这个路径怎么获取?我们现在这是不是啊。我可以这样this.get。
29:07
Contest。第二,Get real pass。Images。对不对,那么这个是谁。这个是。啊,获取。这个这个。文件保存在服务器的。路径加上注释啊,我们都加注释,这个是,嗯,获取书。Rou Liu。
30:00
其中有什么,其中有上传文件的内容啊,它里边有这个上传文件的内容啊。呃,这是我们的目标文件。创建目标。创建目标文件将来。用于。保存什么,上传文件,创建文件输出流是吧?好继续那输有了,输出流有了,现在要做的是什么?是不是把输流的数据写到输出流里边。然后呢,这个输入流关联着谁。关联的这个文件呢,这不就写到他了,他在哪放着呢,在这个目录下文件名也有了,这不就搞定了吗?
31:05
文件内容的拷贝,这这这这简单吧。固定格式将。输入流中数据写入到输出。LAN,不一吧。啊,这这这这个办了数组吧,八分我们就写。BF了啊buff分我new一个bit数组1024缓存的是吧,紧接着要拷贝数据了。他不等于只要它不等于负余,就是只要它没结束啊,里边有内容啊是吧?他是谁?LL是从哪来的啊?是is.read。
32:08
知道吧,紧接着。OS点。Right。Right buffer。从零开始,OK。这是不是就完成了,最后干嘛关闭流。那按逆序关呗,呃,后创建的。OS,那就OS,先关close,然后close OK了,这就完成了。就我们文件上传。就基本的文件上传功能就完成了。跑一下吧。
33:01
Yeah。看能跑起来不能啊。好。李四,24。你注意我们控制台还要输出是不是李四24啊,然后浏览。浏览我们要要什么,要桌面的这个文本啊。注册。Yeah。哦,明白了,哎,不对呀,不对呀。运行结果不对呀。
34:02
毛发的请求是吧?这。关了。这样要不还得重新输啊。零二是吧,零四。24。你是24。呀,这可是不对啊。这现在运行的程序可不是啊,这现在运行的谁现在一直运行的是原来这个程序。
35:01
这运行的可不对,运行的程序就是不对。Remo。Remove,啊,这样把这都关了,把这都关了啊。现在跑的程序就一直跑的是他。虽然写的是零二。嗯。
36:02
诶,这怎么回事儿呢?现在跑的程序仍然是刚才那个啊,那这样。这样,我。我这个关一下。我看看咱没有改错地方吧,哦,没有。没有啊。他现在一直运行着它。一直运行的是它啊。你看看啊,我们给这儿,我给这儿加一个输出语句。
37:01
执行上传,或者加到这一个输出语句啊,执行上传这样。我把这个eclipse关一下。王五。二九。
38:07
是吧,直行上传,那刚才是可能eclipse的问题啊,进行上传这是执行了。这儿是执行了。这儿运行了是不错。暂且啊,我们先在这儿运行了,但是现在的问题是什么,并没有出现那个另存框。为什么?呀,错了。这里边儿还有个东西。
39:03
还有个东西,我们找到feel uplo的。哎。我看这里边写了没啊。我们也不用看他另存了,我们直接看谁。出什么另存呢,这会儿这迷呢,啊呃,这是文件上传,已经上传到了服务器,我们打开服务器看一下有没有。另存是下载是吧。看着。找到。SCO。
40:05
是这儿吧。你买的有没有。打开。OK了,文件上传完成了。
我来说两句