struts2实现单个文件上传

第一步

 框架的选择
在struts2-core-2.1.8.1.jar包里面 按照 org.apache.struts2 查询 找到default.porperties 默认的资源文件
看到关于上传文件的信息
### Parser to handle HTTP POST requests, encoded using the MIME-type multipart/form-data
# struts.multipart.parser=cos
# struts.multipart.parser=pell
struts.multipart.parser=jakarta
# uses javax.servlet.context.tempdir by default
struts.multipart.saveDir=
struts.multipart.maxSize=2097152

struts.multipart.parser= 是选择哪种框架形式来上传文件
在这里struts.multipart.parser=jakarta 默认的是jakarta  jakarta是Commo-FileUpload 的框架,所有要导入"commons-fileupload-1.2.1.jar"和"commons-io-1.3.2.jar"

如果改成struts.multipart.parser=cos 那就是用cos框架上传 只要导入cos.jar

想要改变struts.multipart.parser 的值  有两种方式  
一是在struts2-core-2.1.8.1.jar中的default.porperties文件中去改
二是在struts.xml文件中加入<constant name="struts.multipart.paeser" value="cos"></constant> value的值就是你要选择上传的方式

需要的struts2的框架包(jar包)struts2-core-2.1.8.1.jar 一定要导入
根据你选择的文件上传的框架导入相应的jar包


第二步

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<form action="stu.action" method="post" enctype="multipart/form-data">
	<input name="image" type="file"/>
	<input type="submit" value="上传照片"/>
</form>

form的enctype属性为编码方式,常用有两种:application/x-www-form-urlencoded和multipart/form-data,默认为application/x-www-form-urlencoded。

当action为get时候,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1&name2=value2...),然后把这个字串append到url后面,用?分割,加载这个新的url。

当action为post时候,浏览器把form数据封装到http body中,然后发送到server。

如果没有type=file的控件,用默认的application/x-www-form-urlencoded就可以了。
但是如果有type=file的话,就要用到multipart/form-data了。浏览器会把整个表单以
控件为单位分割,并为每个部分加上Content-Disposition(form-data或者file),Content-Type(默认为text/plain),name(控件name)等信息,并加上分割符(boundary)。


第三步

写action  这个action继承BaseAction
//为了演示 只设一个

public class BaseAction{
	public static final java.lang.String SUCCESS = "success"; 
}

这里使用jakarta的框架类型

package com.aciton;

import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;

public class StudentsAction extends BaseAction {
	private File   image;  //文件内容
	private String imageFileName;   //文件名称
	private String imageContentType;    //文件类型
	
	public File getImage() {
		return image;
	}
	public void setImage(File image) {
		this.image = image;
	}
	public String getImageFileName() {
		return imageFileName;
	}
	public void setImageFileName(String imageFileName) {
		this.imageFileName = imageFileName;
	}
	public String getImageContentType() {
		return imageContentType;
	}
	public void setImageContentType(String imageContentType) {
		this.imageContentType = imageContentType;
	}
	

	public String execute(){
		String  path = ServletActionContext.getServletContext().getRealPath("/image");
		System.out.println(path);
		if(image!=null){
			File savefile = new  File(new File(path),imageFileName);
			if(!savefile.getParentFile().exists()){
				savefile.getParentFile().mkdirs();
			}
			try {
				FileUtils.copyFile(image,savefile);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			String []  t  = imageContentType.split("/");
			for(String s : t){
				System.out.println(s);
			}
		}
		return SUCCESS;
	}
}


如果用cos框架的话

import java.io.File;  
    import java.io.FileInputStream;  
    import java.io.FileOutputStream;  
    import java.io.InputStream;  
    import java.io.OutputStream;  
      
    import org.apache.struts2.ServletActionContext;  
      
    import com.opensymphony.xwork2.ActionSupport;  
      
    public class UploadAction extends ActionSupport {          
        // myFile属性用来封装上传的文件  
        private File myFile;  
          
        // myFileContentType属性用来封装上传文件的类型  
        private String myFileContentType;  
      
        // myFileFileName属性用来封装上传文件的文件名  
        private String myFileFileName;  
            
        //获得myFile值  
        public File getMyFile() {  
            return myFile;  
        }  
        //设置myFile值  
        public void setMyFile(File myFile) {  
            this.myFile = myFile;  
        }  
      
        //获得myFileContentType值  
        public String getMyFileContentType() {  
            return myFileContentType;  
        }  
        //设置myFileContentType值  
        public void setMyFileContentType(String myFileContentType) {  
            this.myFileContentType = myFileContentType;  
        }  

        //获得myFileFileName值  
        public String getMyFileFileName() {  
            return myFileFileName;  
        }  
        //设置myFileFileName值  
        public void setMyFileFileName(String myFileFileName) {  
            this.myFileFileName = myFileFileName;  
        }  
      
        public String execute() throws Exception {  
              
            //基于myFile创建一个文件输入流  
            InputStream is = new FileInputStream(myFile);  
              
            // 设置上传文件目录  
            String uploadPath = ServletActionContext.getServletContext()  
                    .getRealPath("/image");  
              
            // 设置目标文件  
            File toFile = new File(uploadPath, this.getMyFileFileName());  
              
            // 创建一个输出流  
            OutputStream os = new FileOutputStream(toFile);  
      
            //设置缓存  
            byte[] buffer = new byte[1024];  
      
            int length = 0;  
      
            //读取myFile文件输出到toFile文件中  
            while ((length = is.read(buffer)) > 0) {  
                os.write(buffer, 0, length);  
            }  
            System.out.println("上传用户"+username);  
            System.out.println("上传文件名"+myFileFileName);  
            System.out.println("上传文件类型"+myFileContentType);  
            //关闭输入流  
            is.close();  
              
            //关闭输出流  
            os.close();  
              
            return SUCCESS;  
        }  
      
    }  

第四步
在struts.xml注册action
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
	"struts-2.1.7.dtd">

<struts>
	<package name="students" extends="struts-default">
	<!-- 
		1:如果你整合了spring 那么class就写这个那个bean中的id名称,如果没有写,就写类的全名(com.action.StudentsAction)这是我的
		2:如果这里你没有写method 那么你就要在form的action 写成stu!execute.action
	-->
		<action name="stu" method="execute" class="studentsAction">
			<result name="success">upload.jsp</result>
		</action>
	</package>
	
</struts>	
<!--
如果控制台有Unable to find 'struts.multipart.saveDir' property setting. Defaulting to  javax.servlet.context.tempdir 输出来 这是提示我们struts.multipart.saveDir没有设值
    struts.multipart.saveDir用于指定存放临时文件的文件夹,该配置写在struts.properties文件或者struts.xml配置文件中
    如果是struts.properties文件,则加入如下代码:struts.multipart.saveDir = /tmp/;或者是struts.xml配置文件,则增加如下代码:<constant name="struts.multipart.saveDir" value="/tmp"/>
-->
<!--
struts的默认上传文件大小为2M,设置上传文件的大小
<constant name="struts.multipart.maxSize" value="104857600"></constant>
-->











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值