6). 一次传多个文件怎么办 ?
private File doc;
private String docContentType ;
private String docFileName;
若传递多个文件, 则上述的 3 个属性, 可以改为 List 类型! 多个文件域的 name 属性值需要一致.
7). 可以对上传的文件进行限制吗 ?
例如扩展名, 内容类型, 上传文件的大小 ?
若可以, 则若出错, 显示什么错误消息呢 ?
消息可以定制吗 ?
可以的!
可以通过配置 FileUploadInterceptor 拦截器的参数的方式来进行限制
maximumSize (optional) - 默认的最大值为 2M. 上传的单个文件的最大值
allowedTypes (optional) - 允许的上传文件的类型. 多个使用 , 分割
allowedExtensions (optional) - 允许的上传文件的扩展名. 多个使用 , 分割.
注意: 在 org.apache.struts2 下的 default.properties 中有对上传的文件总的大小的限制. 可以使用常量的方式来修改该限制
struts.multipart.maxSize=2097152
定制错误消息. 可以在国际化资源文件中定义如下的消息:
struts.messages.error.uploading - 文件上传出错的消息
struts.messages.error.file.too.large - 文件超过最大值的消息
struts.messages.error.content.type.not.allowed - 文件内容类型不合法的消息
struts.messages.error.file.extension.not.allowed - 文件扩展名不合法的消息
问题: 此种方式定制的消息并不完善. 可以参考 struts2-core-2.3.28.jar 下的 org.apache.struts2 下的 struts-messages.properties, 可以提供更多的定制信息.
解决6 和7 中的问题?
为了实现多文件上传,我们需要在简易版 文件上传UpdateFile(Struts2版)的基础上 ,修改 Update.java 和 TestUpdateAction.java ,upload.jsp即可
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
修改后的 Update.java
package com.baidu.update;
import java.io.File;
import java.util.List;
public class Update {
private List<File> doc;
private List<String> docContentType ;
private List<String> docFileName;
private List<String> docDesc;
public List<File> getDoc() {
return doc;
}
public void setDoc(List<File> doc) {
this.doc = doc;
}
public List<String> getDocContentType() {
return docContentType;
}
public void setDocContentType(List<String> docContentType) {
this.docContentType = docContentType;
}
public List<String> getDocFileName() {
return docFileName;
}
public void setDocFileName(List<String> docFileName) {
this.docFileName = docFileName;
}
public List<String> getDocDesc() {
return docDesc;
}
public void setDocDesc(List<String> docDesc) {
this.docDesc = docDesc;
}
@Override
public String toString() {
return "Update [doc=" + doc + ", docContentType=" + docContentType
+ ", docFileName=" + docFileName + ", docDesc=" + docDesc + "]";
}
}
修改后的Action:TestUpdateAction.java
package com.baidu.update;
import java.io.File;
import java.util.List;
public class Update {
private List<File> doc;
private List<String> docContentType ;
private List<String> docFileName;
private List<String> docDesc;
public List<File> getDoc() {
return doc;
}
public void setDoc(List<File> doc) {
this.doc = doc;
}
public List<String> getDocContentType() {
return docContentType;
}
public void setDocContentType(List<String> docContentType) {
this.docContentType = docContentType;
}
public List<String> getDocFileName() {
return docFileName;
}
public void setDocFileName(List<String> docFileName) {
this.docFileName = docFileName;
}
public List<String> getDocDesc() {
return docDesc;
}
public void setDocDesc(List<String> docDesc) {
this.docDesc = docDesc;
}
@Override
public String toString() {
return "Update [doc=" + doc + ", docContentType=" + docContentType
+ ", docFileName=" + docFileName + ", docDesc=" + docDesc + "]";
}
}
修改后的 upload.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<s:debug></s:debug>
<s:form action="tesupdate" method="post" enctype="multipart/form-data">
<s:file name="doc" label="DocFile1"></s:file>
<s:textfield name="docDesc[0]" label="Desc1"></s:textfield>
<s:file name="doc" label="DocFile2"></s:file>
<s:textfield name="docDesc[1]" label="Desc2"></s:textfield>
<s:file name="doc" label="DocFile3"></s:file>
<s:textfield name="docDesc[2]" label="Desc3"></s:textfield>
<s:submit></s:submit>
</s:form>
</body>
</html>
仅需要在简易版文件上传的基础上修改这三个文件就可以完成多文件的上传,但是还不完美,我们还可以通过修改struts.xml 配置来实现对上传文件的限制
修改后的struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 配置全局的国际化资源文件 -->
<constant name="struts.custom.i18n.resources" value="nihao"></constant>
<!-- 修改默认配置总的上传文件的最大值 maxSize-->
<constant name="struts.multipart.maxSize" value="10485760"></constant>
<package name="default" namespace="/" extends="struts-default">
<interceptors>
<interceptor-stack name="baidu">
<interceptor-ref name="defaultStack">
<!--
maximumSize:配置单个上传文件的最大值
allowedTypes: 配置允许上传文件的类型
allowedExtensions:配置允许上传文件的扩展名
文件类型和文件的扩展名对照表 详见http://download.youkuaiyun.com/detail/chuck_kui/9519873
-->
<param name="fileUpload.maximumSize">2097152</param>
<param name="fileUpload.allowedTypes">text/html,application/vnd.ms-powerpoint,text/doc,image/png</param>
<param name="fileUpload.allowedExtensions">html,doc,txt,png</param>
<param name=""></param>
</interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="baidu"/>
<action name="tesupdate" class="com.baidu.update.TestUpdateAction">
<result>/upload.jsp</result>
<result name="input">/upload.jsp</result>
</action>
</package>
</struts>