总结一下Struts2的文件上传以及多个文件上传,方便自己,也方便他人.
Struts 2是通过Commons FileUpload文件上传。Commons FileUpload通过将HTTP的数据保存到临时文件夹,然后Struts使用fileUpload拦截器将文件绑定到Action的实例中。从而我们就能够以本地文件方式的操作浏览器上传的文件。
需要commons-fileupload.jar
web.xml
<!-- Action Servlet Configuration -->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<filter>
<filter-name>struts-cleanup</filter-name>
<filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>
</filter>
<filter-mapping>
<filter-name>struts-cleanup</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>
org.tuckey.web.filters.urlrewrite.UrlRewriteFilter
</filter-class>
<init-param>
<param-name>logLevel</param-name>
<param-value>WARN</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
struts.xml
<!--店铺BEGIN-->
<package name="com.zhekou.store.web.action.storephoto" extends="struts-default">
<action name="storephoto_*" class="com.zhekou.store.web.action.storephoto.StorePhotoAction" method="{1}">
<interceptor-ref name="fileUploadStack"/>
<result name="add">/b_admin/store/admin_store_photo.jsp</result>
</action>
</package>
<!--店铺END-->
</struts>
struts.properties
此处 /tmp 为 临时存放图片目录
StorephotoAction.java
此处Action需要注意,由于struts2取消了FormBean的概念,因此原先写在FormBean中的属性 现在都要写在Action中,struts2中上传文件的成员变量是有命名规范的:
单个上传
private File photo;
private String photoFileName;
private String photoContentType;
多个上传
private File[] photo;
private String[] photoFileName;
private String[] photoContentType;
setter/getter 略
大家可以看到 取得上传文件的名称不再是简单的file.getName(),而是拿photoFileName来取得上传文件的名称(包括后缀),命名规范是
文件对象名称=自定义 private File photo;
文件名称 =文件对象名称+FileName private File photoFileName;
文格式名称 =文件对象名称+photoContentType private String[] photoContentType;
这块一定要切忌!!!何曾几时我总是拿不到上传文件的文件名。。
之后就是IO流的操作了这里忽略了。
多个文件上传的时候 除了可以用数组之外 您还有一种选择那就是LIST.
最后说一说 错误处理
把下属代码放在struts.xml 的<action></action>之间
用来设置最大上传文件是多少K 以及允许上传的类型
不要忘了写上input 这是出错后跳转的页面。里面加上<s:fielderror />,会显示出错的信息。