您的位置:首页 > 编程语言 > Java开发

关于Struts2的文件上传功能

2010-10-20 22:45 555 查看
在Web项目中文件上传是一个必不可少的经典功能,因此为了满足文件上传功能需在form
表单里添加一条属性

enctype
="multipart/form-data"



此属性的功能是设置表单的MIME
编码。如果不设置的话

form表单

默编码格式为application/x-www-form-urlencoded

,此种格式不能用于文件上传。如果是多文件上传的话,多个

input标签的
name
属性必须是同一个值。示例如下:

<body>
<h1>Struts2文件上传功能演示</h1>
<hr/>
<form action="upload/singlefile.action" method="post" enctype="multipart/form-data">
单个文件上传演示:<br/>
<input type="file" name="single"/>
<input type="submit" value="上传"/>
</form>
<hr/>
<form action="upload/multifile.action" method="post" enctype="multipart/form-data">
多个文件上传演示:<br/>
<input type="file" name="multi"/><br/>
<input type="file" name="multi"/><br/>
<input type="file" name="multi"/><br/>
<input type="submit" value="上传"/>
</form>
</body>


我把单文件和多文件的上传功能都通过这一个JSP页面为展示。

现在开始配置struts.xml文件,我打算把文件的保存目录通过参数的方式写在配置文件里而不是直接写死在代码里,这样成是为了方便以后更改。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="fileupload" extends="struts-default" namespace="/upload">
<action name="singlefile" class="web.action.SingleFileUpload" method="execute">
<param name="savePath">/images</param>
<result>/result.jsp</result>
</action>
<action name="multifile" class="web.action.MultiFileUpload">
<param name="savePath">/images</param>
<result>/result2.jsp</result>
</action>
</package>
</struts>


OK!现在开始写代码部分。

package web.action;
import java.io.File;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
public class SingleFileUpload {
private File single;
private String singleContentType;
private String singleFileName;
private String savePath;

public File getSingle() {
return single;
}
public void setSingle(File single) {
this.single = single;
}
public String getSingleContentType() {
return singleContentType;
}
public void setSingleContentType(String singleContentType) {
this.singleContentType = singleContentType;
}
public String getSingleFileName() {
return singleFileName;
}
public void setSingleFileName(String singleFileName) {
this.singleFileName = singleFileName;
}
public String getSavePath() {
return savePath;
}
public void setSavePath(String savePath) {
this.savePath = savePath;
}

public String execute()throws Exception
{
if(single!=null)
{
//得到文件保存路径
String path = ServletActionContext.getServletContext().getRealPath(savePath);
File dir = new File(path);
if(!dir.exists()) dir.mkdir();
FileUtils.copyFile(single, new File(dir,singleFileName));
ActionContext.getContext().put("message", "文件上传成功!");
ActionContext.getContext().put("filename", singleFileName);
ActionContext.getContext().put("content", singleContentType);
ActionContext.getContext().put("path", path);
}
ActionContext.getContext().put("message", "文件上传失败!");
return "success";
}
}


这是一个实现单文件上传功能的类代码,因为在单文件上传的form里定义一个input标签用来上传文件,这个标签的name属性为single,因此代码中有一个实现了getter/setter
方法的变量single(其实变量名叫什么并不重要,重要的是方法名必须和标签的name名相同)。而singleContentType和singleFileName其实就是用来表示这个文件的类型和文件名。copyFile
方法用于实现文件复制,即把上传的文件复制到指定的路径下,因为这个方法是FileUtils类的静态方法,而FileUtils类包含在commons-io-1.3.2.jar
包文件里,所以在项目里还需要把这个文件从Struts2的类库包里导入进来。

下面再看多文件上传的类,其实多文件上传和单文件上是一个道理。

package web.action;
import java.io.File;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
public class MultiFileUpload {
private File[] multi;
private String[] multiContentType;
private String[] multiFileName;
private String savePath;
public File[] getMulti() {
return multi;
}
public void setMulti(File[] multi) {
this.multi = multi;
}
public String[] getMultiContentType() {
return multiContentType;
}
public void setMultiContentType(String[] multiContentType) {
this.multiContentType = multiContentType;
}
public String[] getMultiFileName() {
return multiFileName;
}
public void setMultiFileName(String[] multiFileName) {
this.multiFileName = multiFileName;
}
public String getSavePath() {
return savePath;
}
public void setSavePath(String savePath) {
this.savePath = savePath;
}

public String execute()throws Exception
{
if(multi!=null)
{
String path = ServletActionContext.getServletContext().getRealPath(savePath);
File dir = new File(path);
if(!dir.exists()) dir.mkdir();
for(int i=0;i<multi.length;i++)
{
FileUtils.copyFile(multi[i], new File(dir,multiFileName[i]));
}
ActionContext.getContext().put("message", "文件上传成功!");
ActionContext.getContext().put("files", multiFileName);
}
ActionContext.getContext().put("message", "文件上传失败!");
return "success";
}
}


多文件和单文件上传类的最大不同是用数组来表示接收的文件其他并无什么特别,因此不多解释了。

再解释下文件上传容量的限制,Struts2的默认文件上传大小为5M,可以通过在struts2.xml文件中配置常量来改变文件上传的大小限制,例如将大小限制在10M。

<constant name="struts.multipart.maxSize" value=" 10701096"></constant>

还有一点是当多文件上传时上传容量限制是指多个文件容量的总和,例如三个文件上传时三个文件的容量总和不能大于以前的容量限制即10M。如果超出容量限制时控制台将报如下错误:

警告: Unable to parse request

org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (6185364) exceeds the configured maximum (2097152)

at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.<init>(FileUploadBase.java:914)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: