限制上传文件类型
这是通过使用拦截器实现的。查看fileuploadinterceptor类,可以看到
protected Set<String> allowedTypesSet = Collections.emptySet();
这个集合就代表着允许上传的文件类型。
虽然在defaultStack已经配置了fileupload拦截器,但是要自己指定参数,因此在action配置中还需配置fileupload拦截器和默认拦截器。
不能只是配置fileupload拦截器,前面已经说过当action中配置有其他拦截器时,默认拦截器不会自动加上,而是要显式的声明一下。
修改struts.xml中的action定义
这样就设置了一个拦截器,它将上传的文件限制为PPT,大小为400K,其中maximumSize单位为b,指单个文件限制。
注意allowedTypes定义的必须是文件的MIME类型,而不是文件扩展名。
MIME类型可以在Tomcat的web.xml文件中找到。
但是上传回到原来的页面时并没有显示出出错信息。这是由于这个错误是fielderror级别的,在upload2.jsp中无法显示这一级别的错误。
增加内容
这样就可以显示出struts2自定义的错误,显然这是无法被用户接受的,因此要自定义错误消息,这在前面的课程中已经讲过了。
查看struts-core-2.1.8.jar,包org.apache.struts2下的struts-messages.properties,这里面定义了相关的内容。
struts.messages.error.file.too.large=File too large: {0} "{1}" "{2}" {3}
struts.messages.error.content.type.not.allowed=Content-Type not allowed: {0} "{1}" "{2}" {3}
覆盖这两处设置即可。
在message.properties文件中,添加如下内容
struts.messages.error.content.type.not.allowed=/u4e0a/u4f20/u6587/u4ef6/u7c7b/u578b/u4e0d/u5141/u8bb8/uff0c/u8bf7/u91cd/u8bd5/uff01
struts.messages.error.file.too.large=/u4e0a/u4f20/u6587/u4ef6/u8fc7/u5927/uff0c/u8bf7/u91cd/u8bd5/uff01
注意在properties文件中不允许出现中文,因此需要用native2ascii这个工具进行转换,上述输出据结果分别为
“上传文件类型不允许,请重试!”和“上传文件过大,请重试!”
文件下载
进行文件下载前,先看看struts-default.xml中关于结果类型的定义,其中有个stream类型,这个就是和文件下载相关的。
查看其实现类StreamResult
查看其字段
这是根据HTTP协议得来的,在此,我们只需要设定contentType,contentDisposition,inputName和inputStream即可
新建download.jsp,内容为
这个超链接将转向DownloadAction。
新建DownloadAction
要进行文件下载,最重要的是设置输入流,即配置inputStream这个属性。
为此需要在Action中写一个方法,返回InputStream。
DownloadAction
在struts.xml中的配置为
其中resut的type为stream,contentType同样也是MIME类型,contentDisposition的值为filename=XXX,这样下载时文件名就为这里所设置的值了。
inputName的值为Action中返回的InputStream的那个方法名,不包含get。
这样就可以完成struts2中的文件下载了。
当然在文件下载前进行权限控制等等。
下次课将学习struts2国际化。