00:00
我们来看一下在抓two里面如何来进行文件的上传和下载。先来看文件的上传。表单方面。需要有这样的三点需要注意。第一个。表单的encoding type设置为multipart form data。第二个。请求的method变为post,第三个增加这个false段,这个呢在我们前面讲文件上传下载的时候已经说过了。Trut two对文件上传的支持靠什么呀?靠拦截器?那后边如何来进行文件上传的话呢?我们直接阅读这个拦截器的Java do就可以了。找到这个拦截器。Well upload SE。找dog。实际上呃,关于文件上传的一切信息都在这个里边。
01:05
OK,我们先来建一个新的四抓速度工程。大环境,直接来复制下包。X文件。的配置文件。还有这个什么呀,国际化资源文件已经复制了啊。进来。这个呢需要听一下。
02:06
配置完成。下面我们来。来新建一个表单。先搞一个表单。点。导入标签库。来写一个表单。Action。Guest。Upload。使用什么烹饪就是。Including type or part from data。
03:01
我们先来上传一个文件和一个一般的文本域。S。Film。那比方说我们传的是一个PPT文件。Table。PP。S。VDDXC。PPT Dee。准备搞一个三米。但是。Family。行。这样的话,那个表单就写好了。下面就是看。如何来使用这个文件上传的拦截器?那这块的话呢,我们还是需要简单的再说一下哈,抓two这个文件上传啊也是。
04:06
使用的这个。阿法奇的comments fair upload主件,所以说我们看一看这个价包里边有没有那个file upload跟那个IO吧,是吧,因为这个fair upload需要借助于这个IO啊,这两个。已经考进来了,所以说在环境方面没有问题,好,下面我们来看如何来使用这个拦截器。用这个拦截器的话呢,我们只需要在我们的action里边写上这样三个对应的属性就可以,一个是file类型,这个是对应的什么呀,对应的这个fail字段的这个属性。那比方说我们这叫PPT,还有一个叫content type,内容类型,还有一个叫file name,指的是文件名,然后我再提供对应的set get方法。我们就可以。得到文件的这个基本信息。
05:00
写一个action。放点艾特硅谷。点八。点。Upload APP。变一个action。Applaud。Action。不累,Action。好了,哎,我们说的第一步就是我需要在这个action里边想得到这个文件的基本信息,包括什么呀,包括代表这个文件的。Fail对象包括代表文件类型的content type和这个文件名的file name,我怎么写?这个前面这个叫file name,这个name是谁呢?我在提表单的时候,这个name于是这样写。
06:04
Private film。PPT private PPT。Content type。Ept。Fair name ola。好,了解上对应的赛方法。写XQ的方法。那我在这里边的话呢,我就可以得到呃,文件的这上述的这三个基本信息。我们看。一个叫。PPT。然后是PPT content timet name。配置一下找一个。
07:05
Y。Action。Glass。Result。Success。Lucy。登录下了建一章的文件。H。Page。还差一个地儿,一块叫testload。复制过来再看效果。这个运行通过的话呢,我们再来写那个笔记。
08:01
刀。Run I。哦,忘了一个是吧,这个PPTDC这个字段忘写了。家长PPTDC。几张对应的盖赛的方法。这个的话呢,我们也来打印一下。
09:01
好了。啊,这是DTD啊,好吧,那就随便搞一个DTD吧。写一个,我们叫DTD。我来点那个萨米。我看到。基本信息是不是获取到了呀。第一个是fail。啊,重写这个兔方法了,这是一个fair。第二个是。Content type,我们传的是一个XML,所以说text的斜杠XML,然后是文件名叫X work,二点三点DTD啊,然后这个是一个。文本域,这文本域叫什么呀?叫DTD,传的时候不就是这样传的吗?哎,这样的话呢,这个基本的文件上传就搞定了,大家回想一下,跟我们前面讲那个文件上传单独用comments file的时候,是不是简单的多呀,当时我们搞了一个file I,我们还得进行验这个这个。
10:06
嗯,检验看它是一个文件语还是一个文本域,很麻烦,看用了框架的话是不是简单很多,这就是框架帮我们干的事,他把这个结果直接给到我们,让我们更方便的进行操作。笔记。Out。RFD。文件的上传。第一个啊,不在需要。注意的三点,这个的话呢,这块我们就不详细说了,因为我们在前面讲文件上传的时候已经强调过了,而且PPT里边的话呢,还有详细的表述。好,第二个拉。的文件上传。实际上使用的是。
11:02
Ho。Fell uplo的主角。Three。需要导入对应两个价包。两个价包叫。两个吧。Comments fill upload I。干不进是吧。两个。这个版本呢,可能会有差异哈,这两个大毛必须要加进来。三。拉。进行文件上传需要使用一个叫fairloud。NT。四基本的文件上传是怎么做的呢?
12:02
基本的文件的上传,这样干的直接在action中。定义如下三个属性。三个属金啊。布置过来第三个。CTRLC过来。喂。点一点。这个实际上应该叫。Field name。哪个哪个name啊,应该叫file field name就是我这个文件域所对应的那个name值。说白了就是他。那我这个里边的话就PPT改过来叫。
13:05
Fair name好了,第二个就是在这个基础上加上一个content type。这应该是对应那个文件的类型啊,一个file name,这个就是文件名。这个是文件。类型这个呢是文件对应的。File对象。啊,并提供对应的在的干的方法。提供对应的。和。就可以了,后边再来进行这个文件上传的话,使用什么呀,使用IO流。
14:02
进行文件的。上传接口,我们这个程序呢,没有完全写完,现在我就用IO流把这个文件传到。呃,当前外部应用的指定目录下。我来搞一个目录,这个目录呢叫fail。Files,我把那个文件传到那个files,不是这个files啊,而是服务器下的那个files。再写一点。的恋爱二。为什么呀,这个说我们需要那个context get pass方法,所以说我先需要来搞一个S。怎么去从action可以了。
15:02
Contact的点get real。And us。登录下的fields架编的。家。PPT。File就是最终的这个文件所在的路径文件名,然后搞一个输出流file。Output out等于you fair orut就可以了。搞一个输入流。File input STEM in等于new file STEM,咱这个PPT下边的话呢,就是纯操作。Edge。阿尔法等于6X。一零。二四。
16:01
Int n等于零,不循环。N等于in点位读到发火里边来,如果这个不到结尾的话。负等于负一就开始写。Out点。Fight。Buffer。零。Out blows。点了。我把这个径的话呢,打印一下,我好找啊。OK。启动。走。就这个吧。2.3d TD。看在这儿呢。CTRLC有没有?
17:05
吧。这个就是文件的一个上传操作。我们再看一个哈。传个别的,比方说我传一个这个,嗯,Overview的HTML。Summit。大家看是不是也来了,文件上传没问题。基本操作的话呢,就这样我们用的是。Fair upload intercept。下边。回来,哎,我们需要有更高一点的要求,他说还会有什么要求啊?比方说一次传多个文件。门店怎么办?一个问题。T可以对。
18:00
上传的文件定型。限制吗?限制什么意思啊,例如扩展名。这种类型上传文件的。大小。可以吗?啊,如果要是可以的话,出错了,显示什么错误消息呢?如果可以,若可以得。Poor。显示什么错误消息呢?消息可以定制吗?哎,这是我们下边要说的问题。就是说前面这个文件上传啊,就单说一个文件上传的话呢,前面已经可以了,但是我们会有更高的追求。
19:04
对面看。意思,要是传多个文件的话怎么办?告诉大家哈,现在是传一个文件,传多个文件,哎,我们这三个属性可以改为。List类型。说啊。传递多个文件。则。上述。的三个属性可以改为list类型。天天搞这个。百为list类型。我们这个里边还有一个问题,我是不是还有一个跟这个文件配套的一个描述呢呀,这个描述怎么处理。咱先回过来看吧,比方说我要传三个文件。
20:01
下来。我要三个。二传三个文件的话呢,他说我们说这个可以改为list类型。那对应的。这个是不是也要写个粒子类型?你赌吗?And o。没事。重新进行。编写盖塞的方法。这个上传这个我们就不传了啊,我们直接把这个结果打印就可以了,这个上传这个方式是一样的,只不过你得用一个数循环。
21:02
这我们不说了。哎,我们发现我这个方法这块这个返回值是不是super呀,Super super是谁呀。Action support action support1的方法返回的不就是success吗?2.3.15。所以说呢,我们即便是在这块没有把这个修改的话呢,也不会出错。行了。这块呢,我改完了,我们看一下这个效果吧。走。刷新一下。注意哈,这个我改成A。
22:01
BC过来。嗯。1.0。2.0。最大的是2.3找一个。看看哈。最大化,我们看前面的话呢,这应该是文件三个。没啥问题是吧,这个是文件的类型,这是文件名,后边这三个描述是不是OK啊。没问题。所以说我们说这块使用list就可以了。笔记呢?哎,这块使用例子就可以,然后说嗯。多个文件域。属性。
23:01
只需要。OK,搞定。那这真没问题吗?这里边儿有一个小问题。有一个什么问题呢?有这么一个问题。比方说进行文件回显的时候,这个PPTDSC有点小问题,我们看一下怎么有问题了哈,我返回。我返回一个什么呀。我返回一个input。这样写。我来配一个input。Input等于upload点。哦。1.0。2.0注意。
24:01
2.3走。我是不是又回来了呀,在回显的时候这个有问题,不回显的话看不出来,回显的时候能看出来,为什么呀。因为我是一个集合类型,而我这个文件与本身的话呢,这个是不会回显的,所以说这块这个问题的话呢,我们可以忽略,但这块有问题怎么解决。我们在前面讲过那个,呃,类型转换器与复杂对象使用的时候怎么搞的,是不是搞了一个下标啊,大家看这个时候的话呢,这个问题我可以这样解决。走。改成零。改成一。改成二。这样就可以了。看一下。直接刷新走。大家看回写没问题了吧,而且这块得到的这个list也OK,嗯,这个是我们需要注意的一个地方,此外没问题。
25:09
好,第二个我们说可以对上传文件进行限制吗?我们来找这个fill up road intercept,看dog。往下翻。我们看到什么呀。我这个拦截器实际上有一些。变量可以配置。可以配一些参数。第一个。上传最大的这个。Size,就是说这个文件的大小。嗯。允许的类型还有一个允许的扩展名,我们可以通过这样的方式来限制文件的上传。写一下。
26:03
我可以的。确定是可以的,那么如何限制呢?可以通过配置。Fair upload。Interceptor。蛮碟气的。参数的方式。来进行限制几个参数呢,三个。啊,第一个要上传文件的大小,是一个文件哈。单位是字节。默认的最大值是两兆。默认的最大值为。
27:00
两兆是什么呢?上传啊。当个。文件的最大值。啊,第二个允许的类型。使用逗号分割。允许。的上传文件的类型多个使用逗号。放歌。一个。允许啊,改名。多个使用动画风格。允许的上传文件的扩展名多个使用。逗号,峰哥哭了。好了,让限制步数消息呢?
28:01
再看这个拦截器,再瞧还有吗?往下翻。哦,我可以在国际化资源文件里边来覆盖这样的,来填写这样的三个键值,这就是。覆盖那个错误消息。复制过来。过来。印制错误。消息可以。在国际化资源。文件中定义。如下见。如家的消息吧。第一个是什么呀。
29:03
应该是说文文文件上传,文件上传。不错的交警。第二个。文件超过大小的消息。超过最大值的消息。这个呢?文件内容类型不合法的交集文件内容类型。不合法的消息。最后一个文件扩展名。好消息,文件扩展名不合法的。交警。这样的话我们就写完了,下面的话呢,我们就来配一下。
30:02
试一试。在这个里面我们可以来。配置。拦截器的参数怎么配得上?Adapts。Intercepttake。指另一个at硅谷。Reference。我们指的是。Default。Deck。然后是我我们指定这个。拦截器的。参数就可以了。我指定一下啊。指定参数找到。哦。参数名我已经知道了是吧,我要找什么呀?我要找他这个拦截器的那个名字。在这里呢?在这儿。
31:00
打开。拦截器的名字。就叫fire upload。C。OK。三个请求参数。用这个也行是吧。一个叫。价值。E。俞矩的。一种类型。还有一个允许的国家名。快。这个大小呢,是。以处级为单位,比方说我们看一下我们这个。
32:03
这个里边这是多少个字节啊,一个是1000个字节,呃,3000个字节,我们指定2000个字节吧。2000,超过2000就不行。这块呢是允许的,这个类型我们写个XHTLN。Text xml,包括这个大小的话呢,也不行,还有一个是。呃,文件的扩展名,我们说HTML。XL,其他的不行,好了也好。写好之后的话呢,我来定制消息。找到国际化堆文件。打开。这个拿掉。三个消息可以定制,分别是这样的三个消息。Control c。就放这儿了哈。
33:18
OK,我们先看一下效果,那现在这个的话呢,我们可以说它是一个阿尔法版。啊,贝塔版还有正式版是吧,我们现在这个还不完备,但是这个雏形呢,可以出得来。看一下。一没问题。好,我写一个四的。我再找一个二的,这个时候的话,我们应该说这个文件太大了。走。哎哟。
34:02
怎么了?是不是过来了呀?我这个配置白配了吗?怎么回事,我配了,我是不是没说我使用这个蓝西站。很多C还得配一下,我需要使用这个拦截机站才可以。手刚才这么写完之后的话呢,看完之后并没有使用。再来。刷新早。看说文件超过最大值信息哦,因为我有两个超过的,所以说每一个里边都会进行打印,这个比较丑啊。我们使用simple主题。然后使用那个。的标签可以来进行显示。修改一下。成为幸福主题。
35:05
那这个时候的话呢,这个label需要我们自己来解。这两个。好,去看。这个错误在哪儿啊?是在few error里边还是在action error里边啊?找一个s bug按一下不就知道了吗?这种。你看它不会自动显示了是吧,我们看哦,这是一个field errors PPT的嘛。
36:05
那里边儿的话呢,有两个X轴里边没有。因为我现在我是有两个出问题了是吧。而且这个显示的呢。这个消息啊,我们觉得不是特别的好。为什么呢?他应该告诉我。这个文件超出了多少,懂我这个意思吧,比方说哪个文件超了多少,这样是不是好一些?所以说这里边儿有一些小问题哈,这个消息的话呢,诚然我们已经定制了,但是这样定制这个消息啊,并不完善。过来看问题一。啊,四中。方式定制的消息。并不。完善完善,比方说我想知道哪个文件超了。
37:00
这个这个这个。多少啊,要求是多大,然后你实际多大,说说的不完善,不完善的话呢,我们就想到。能搞一个完善的吗?当然可以,这个时候我们需要看什么呢?嗯。可以参考。很好的呀。我们一定是有一个购物消息对应的一个资源文件找一下。Stra Co。注意哈。第一个包儿下边有一个。Messages的properties。打开它,这里有。可以参考这个下的。He fought。We default to discuss me the properties。OK,我打开。我们看一下这里边儿啊。
38:01
有消息大家看哎这四个吗。Control。C。复制到这个里面来,国际化资源文件在哪这个。不为。每个都加一个标记,这里边我们看到一个什么呀,是不是有单位符啊。这个时候的话呢,他会给我们提供更多的信息,你可以有选择的看是不是要这些占位符,懂了吧。于是。重启。那我们显示这个错误消息呢,我们选择。怎么显示,我们需要在每一个后边都显示吗?还是只选择,还是只显示个别的,那比方说啊,我在这个下边后边显示一个消息。
39:03
放在一起显示啊S的。P。好看。放心走。大家看这个时候给的这个信息是不是更完备呀,你看比方说说这个文件,呃,超大小是多少。要求是多大呢?啊,这个是3833829,这个是2024。太大了是吧,嗯,实际上是多少,哎,这个时候给的信息的话呢,就会更加的完备一些,但是这块显示的这个格式化很明显还不是太好,所以说这个显示消息啊,还不能放在每一个文件域的后边,应该放在一个总的一个前边,我们给它。
40:05
再弄一下,把这个的话应该放在前面啊。方块比较合适是吧。我的后边太多了。拿掉这个可以掉。这个可以删掉,哎,这是一个就好的一个效果,否则显示的一个消息太多了再走。这个消息呢,的确是我们定制的,这里边可以显示什么呢?可以显示文件名,可以显示这个大小。哎,我们可以搞得到,那具体定制的话呢,大家课后去完成就可以了。好了,这是错误消息定制这块。这块完成以后的话呢,我们再看。扩展名。搞一个扩展名的,看看效果,扩展名的。我到首页,我到我的这个桌面,我桌面呢,有很多这个TXT。
41:09
好了,最后一个。大家看告诉我什么呀,扩展名是不合法的是吧,没问题。好了。可以找到我们的note,到这块的话呢,国际化这件事我们基本上可以解决了,说参考它可以提供可以提供更多的定制信息。基本上我们这个文件上传OK了,还有一个地方需要说这个地方。We。我们打开我们这个。Default their properties。哎,我们前面看这个文件的时候呢。
42:01
看见过类似的一条消息,往后翻。看到这块了吧,诶文件上传。最大值是两兆,就总的最大值就是两兆,我把这个复制一下CTRLC。再看一眼哈,找到我们的SPA的配置文件。这个里边的话呢,我都改一下,改为两兆,这要这要是改为两兆的话。这意味着我懂的一定是可以超过两兆的,那么我们为了看到这个效果呢,我们决定把这个扩展名和这个ddd这个展示去掉,因为嗯。光光是这个HTML格式的,我们找那么大的文件啊。你明天住点。我们就拿这个文件大小来说事。
43:00
走。超过两兆的正在上课。这些的话都都比较大。GPM这个是两兆多。呃,Spring mvc2兆多。就搞一个。行吧。就这样吧,是吧,找个AX找一个。大家看这什么问题啊。上传也没有成功,消息没有打印什么问题,打开我们看是不是出了一个action errors啊。哦,这个时候说文件的大小超了,我们用action errors把这个错误打印一下。放这吧。Action。就是说呀,如果种的大小超了的话呢,这不是哪一个字段的问题,而是整个action的问题,对吧。
44:04
这种。大家看这个是不是肿的超了呀,啊,肿的就这么大,你超了。所以说。这个不行,我们现在的话呢,我们都传的小一点的,比方说我都传。嗯,一兆多的。得给传一个小的。这个也传一个小的。这个种的应该是在两兆以内吗。这也不行啊,我们也超过他了。总的在两兆以内,七三七二十一啊。这个可以。好找一个,哎,这是可以成功的,这没问题。
45:00
啊,我们这块有一个种的大小的问题。一个。下个文件,Default properties。中。啊。有被上传的文件,懂的。大小的限制啊,可以使用常量的方式。来修改该建,我把这个的话呢,先复制过来。Before their properties。D。修改这个的话呢,我们在前面我们已经改过好多次了,是吧,比方说我们修改这个,呃,当前strong应用可以接受的扩展名,这个的话呢,我们就不再带着大家修改了。
46:08
这块的话呢,再跟大家说一下。我们刚才看到了,如果我这个总量超了,它会打印总量超出那个消息,而不会打出单个文件超出的那个错误消息,对吧。那单个文件抽出那个消息的话呢,应该是在总量不超的情况下再打印出来,这个我们在前边那个实验里边已经看到了,这里边儿我们就不再进行说明。哎,以上呢,就是我们文件,呃,Two文件上传需要注意的方方面面,大家可以来参看我这个笔记,然后自己再来做一些练习。OK。
我来说两句