Struts2并未提供自己的上传文件组件,但是Struts2却可以使用其他的上传文件组件,比如Commons-FileUpload,Cos等。即使不懂这些组件细节,我们依然可以正常使用,因为Struts2已经为这些组件封装好了接口,我们按照其规范实现即可。
本文介绍Struts2使用常用的Commons-FileUpload组件实现文件的上传。引入commons-fileupload.jar,因为组件依赖commons-io组件,所以同时引入commons-fileupload.jar和commons-io.jar(至于版本不再叙述)
首先编写Action类:
package com.upload;
import static org.apache.struts2.ServletActionContext.getActionContext;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Map;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
/*
* 单文件上传
*/
public class Upload extends ActionSupport {
private File file;
//文件名
private String fileFileName;
//文件类型
private String fileContentType;
//文件大小
private String maximumSize;
//上传允许的文件类型
private String allowedTypes;
public String getMaximumSize() {
return maximumSize;
}
public void setMaximumSize(String maximumSize) {
this.maximumSize = maximumSize;
}
public String getAllowedTypes() {
return allowedTypes;
}
public void setAllowedTypes(String allowedTypes) {
this.allowedTypes = allowedTypes;
}
public File getFile() {
return file;
}
public void setFile(File file) {
this.file = file;
}
public String getFileFileName() {
return fileFileName;
}
public void setFileFileName(String fileFileName) {
this.fileFileName = fileFileName;
}
public String getFileContentType() {
return fileContentType;
}
public void setFileContentType(String fileContentType) {
this.fileContentType = fileContentType;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
File uploadFile=new File(ServletActionContext.getServletContext().getRealPath("uploadFile"));
if(!uploadFile.exists())
{
uploadFile.mkdir();
}
// 第一种读写方式
FileInputStream input=new FileInputStream(file);
FileOutputStream out=new FileOutputStream(uploadFile+"\\"+fileFileName);
try
{
byte[] b =new byte[1024];
int i=0;
while((i=input.read(b))>0)
{
out.write(b, 0, i);
}
}catch(Exception e)
{
e.printStackTrace();
}finally
{
input.close();
out.close();
}
//获得上传文件的大小
//若是上传的文件大小大于规定的大小则返回错误页面
if(file.length()>Long.parseLong(maximumSize))
{
Map request=(Map)ActionContext.getContext().get("request");
request.put("errorMessage","文件太大,不能上传!");
return "input";
}
boolean flag=false;
//限制的文件类型
String[] allowedTypesStr=allowedTypes.split(",");
for(int i=0;i<allowedTypesStr.length;i++)
{
if(fileContentType.equals (allowedTypesStr[i]))
{
flag=true;
}
}
if(flag==false)
{
Map request=(Map)ActionContext.getContext().get("request");
request.put("errorMessage","文件类型不正确!");
return "input";
}
return "success";
}
}
注意:文件名和文件类型的命名都是有要求的,文件名和文件类型的前缀是文件变量。
比如:上文中的文件变量是file,则文件名变量是fileXX,文件类型是fileXX。
同时在Action中定义了上传文件的大小和类型的限制。
//文件大小限制
private String maximumSize;
//上传允许的文件类型限制
private String allowedTypes;
在struts2.xml配置文件进行配置:
<package name="upload" namespace="/" extends="struts-default">
<action name="upload" class="com.upload.Upload">
<param name="maximumSize">1000000</param>
<param name="allowedTypes">application/msword,text/plain</param>
<result name="success">success.jsp</result>
<result name="error">error.jsp</result>
<result name="input">input.jsp</result>
</action>
</package>
前台jsp文件:
<form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="file"><p>
<input type="submit" value="登录">
</form>
注意:表单数据的编码格式enctype="multipart/form-data",<input type="file" name="file">文件类型的输入域的name是Action中的File对象的名称。
表单数据的编码格式enctype有三个值:text/plain;指定了表单是以文本的方式进行提交。application/x-www-form-urlencoded这是默认的编码方式,提交时,只提交表单域的value属性值。multipart/form-data是把文件中的内容也提交。