FileUpload——在Struts2中上传文件
?
大家可能注意一个问题很久了,在现在我们使用的Struts2版本中有一个commons-fileupload.jar,之前我们就提到,这个jar包主要是对文件上传的支持,看来Struts2认为在一个应用中文件的上传是个必要。本章节我们就一起来看看怎样在Struts2中实现文件上传,配置及基本做法。
<%@ page language="java"contentType="text/html; charset=UTF-8"
??? pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags"prefix="s" %>
<!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>FileUpload Page</title>
</head>
<body>
?
????? <h2>Pleaseselect a file </h2>
????? <s:form action="doUpload" enctype="multipart/form-data"method="post">
?????????? <s:file name="upload"? label="UploadFile"/>
?????????? <s:textfield name="caption" label="Caption"/>
?????????? <s:submit></s:submit>
????? </s:form>
</body>
?????? <%@ page language="java"contentType="text/html; charset=UTF-8"
??? pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags"prefix="s" %>
<!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>Upload Successfully</title>
</head>
<body>
?
????? <h2>Hereare some message about uploaded file</h2>
?????
????? <p>
?????????? <b>File:</b> <s:property value="upload" /><br />
?????????? <b>Caption:</b> <s:property value="caption" /><br />
?????????? <b>ContentType:</b> <s:property value="uploadContentType" /><br />
?????????? <b>FileName:</b> <s:property value="uploadFileName"/><br />
????? </p>
</body>
package com.lele.struts2.fileuploadTest; import java.io.File; public class FileUploadAction { private File upload; private String caption; private String uploadContentType; private String uploadFileName; public String execute() { return "success"; } public File getUpload() { return upload; } public void setUpload(File upload) { this.upload = upload; } public String getCaption() { return caption; } public void setCaption(String caption) { this.caption = caption; } public String getUploadContentType() { return uploadContentType; } public void setUploadContentType(String uploadContentType) { this.uploadContentType = uploadContentType; } public String getUploadFileName() { return uploadFileName; } public void setUploadFileName(String uploadFileName) { this.uploadFileName = uploadFileName; }}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
??? "-//ApacheSoftware Foundation//DTD Struts Configuration 2.1.7//EN"
??? "http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
????? <package name="fileupload" extends="struts-default">
?????
?????????? <action name="index">
???????????????? <result>fileUpload.jsp</result>
?????????? </action>
?
?????????? <action name="doUpload" class="com.lele.struts2.fileuploadTest.FileUploadAction">
???????????????? <result>success.jsp</result>
?????????? </action>
????? </package>
?
?
大家或许注意到了一些东西,在上传文件的页面中只有<x:file>和<x:textfield>,怎么在Action里有4个?这明显不对应。这一切都是<x:file>的缘故,一个标签对应了三个属性(uploaduploadContentType uploadFileName)。
首先要求被校验的Action类继承自ActionSupport
然后在Action类的目录下new一个Action类名-validation.xml,在其中填写以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
? ??????? "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
? ??????? "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
?
<validators>
????? <field name="upload">
?????????? <field-validator type="fieldexpression">
???????????????? <param name="expression"><![CDATA[upload.length() > 0]]></param>
???????????????? <message>Filecannot be empty</message>
?????????? </field-validator>
????? </field>
????? <field name="caption">
?????????? <field-validator type="requiredstring">
???????????????? <message>Captioncannot be empty</message>
?????????? </field-validator>
????? </field>
<result name="input">fileUpload.jsp</result>
这样就Ok了。
<action name="doUpload" class="com.lele.struts2.fileuploadTest.FileUploadAction">
???????????????? <interceptor-ref name="fileUpload">
????????????????????? <param name="allowedTypes">
??????????????????????????? image/bmp,image/x-png,image/pjpeg,image/gif
????????????????????? </param>
???????????????? </interceptor-ref>
???????????????? <interceptor-ref name="defaultStack"></interceptor-ref>
???????????????? <result name="input">fileUpload.jsp</result>
???????????????? <result>success.jsp</result>
没错我们使用了拦截器,当然这个拦截器不是我们自己写的而是Struts2本身的东东,在这里我们要求上传类型必须是图片类型,而后我们还需要之前的默认拦截器,因为我们要校验。(对拦截器不明白的朋友可以去看我之前的文章:Struts2的核心——拦截器)。
?????? 这时我们再来上传文件,就会发现我们只能上传指定的文件类型了,同样可以使用maximumSize参数来设定上传文件大小。
?????? 不过新的问题又来了,校验是没问题了,校验失败时输出的信息可有点烦人,能不能换成自定义的信息。当然这种信息是Struts2默认信息,不要以为是什么错误。这种情况下我们就要在全局国际资源文件中做点事情了。在资源文件中加入“struts.messages.error.content.type.not.allowed=The file you uploadedrequired image。现在可以了吧。
?
?????? OK,本章节内容就到这里了,下面的章节会介绍到多文件上传,有兴趣的朋友继续向下读。下个章节再见。
?
?