Struts2实现单个文件上传的示例

      Struts2并未提供自己的上传文件组件,但是Struts2却可以使用其他的上传文件组件,比如Commons-FileUploadCos等。即使不懂这些组件细节,我们依然可以正常使用,因为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是把文件中的内容也提交。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值