首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

FileUpload——在Struts2中下传文件

2012-10-30 
FileUpload——在Struts2中上传文件?大家可能注意一个问题很久了,在现在我们使用的Struts2版本中有一个commo

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>&nbsp;&nbsp;&nbsp;&nbsp;<s:property value="upload" /><br />

?????????? <b>Caption:</b>&nbsp;&nbsp;&nbsp;&nbsp;<s:property value="caption" /><br />

?????????? <b>ContentType:</b>&nbsp;&nbsp;&nbsp;&nbsp;<s:property value="uploadContentType" /><br />

?????????? <b>FileName:</b>&nbsp;&nbsp;&nbsp;&nbsp;<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,本章节内容就到这里了,下面的章节会介绍到多文件上传,有兴趣的朋友继续向下读。下个章节再见。

?

?

热点排行