Struts2实现文件上传

之前利用Servlet3.0提供的API实现了简单的文件上传,链接: Servlet 3.0改进的API 实现文件上传
这里使用Struts2来实现文件上传。

首先要在项目中导入Struts2的相关jar包,及common-fileupload.jar和common-io.jar,因为struts2默认上传解析器使用的是jakarta;

实现上传功能

1、首先创建jsp页面 、编写提交表单

<form action="upload.action" method="post" enctype="multipart/form-data">
    <input type="file" name="upload"><br>
    <input type="submit" value="submit">
</form>

2、创建Action实现上传功能

public class UploadAction extends ActionSupport {

    //文件上传域指定的文件,属性名upload必须与文件上传域的name属性相同
    private File upload; 
    //上传文件的原始文件名:由Struts2自动赋值, name+FileName
    private String uploadFileName; 
    //上传文件的MIME类型:由Struts2自动赋值, name+ContentType
    private String uploadContentType;

    public String execute()throws IOException
    {
        //获取ServletContext
        ServletContext servletCtx = ServletActionContext.getServletContext();       
        //获取文件输入流
        InputStream in = new FileInputStream(upload);
        //根据项目的文件存放路径,获取操作系统上的真实路径
        String path = servletCtx.getRealPath("/WEB-INF/upload");
        //获取输出流(输出位置:path+File.separator+uploadFileName),可指定绝对路径(需要手动创建文件夹)
        OutputStream out = new FileOutputStream("F:\\uploads"+File.separator+uploadFileName);
        //设立字节数组作为缓冲区(大小为1K)
        byte[] buffer = new byte[1024];
        //每次读入的字节数
        int len =0;
        while((len=in.read(buffer))>0)
        {
            //将字节数组中的字节送入输出流,写到硬盘
            out.write(buffer, 0, len);
        }
        in.close();
        out.close();    
        return SUCCESS;
    }
    //-----省略getter、setter

Action中的属性与请求参数的name属性相同时,Struts2会自动赋值。所以Action的upload成员变量(private File upload;)与表单文件域的name属性同名。

3、struts.xml中配置拦截器对文件上传进行过滤

<struts>    
    <!--struts2对整个项目的文件上传大小的控制 ,默认为2M,此处设置为10M(1024*1024*10)-->
    <constant name="struts.multipart.maxSize" value="10485760"/>
    <package name="upload" extends="struts-default">
        <action name="upload" class="com.xxx.action.UploadAction">

            <!-- 引用struts2提供的拦截器,对上传文件过滤 -->
            <interceptor-ref name="fileUpload">
                <!-- fileUpload拦截器对上传文件大小的限制,该值必须小于struts.multipart.maxSize -->
                <param name="maximumSize">10485759</param>
                <!-- 限制上传文件类型(MIME)-->
                <param name="allowedTypes">image/jpeg,image/gif</param> 
            </interceptor-ref>

            <!-- 引用fileUpload拦截器后,必须手动引用 defaultStack拦截器栈,因为此时该action不再自动引用-->
            <interceptor-ref name="defaultStack"></interceptor-ref>

            <result name="success">success.jsp</result> 
            <!-- 文件上传失败时,自动跳转的视图
            <result name="input">fail.jsp</result>
        </action>
    </package>
</struts>

1)、Struts2 对文件上传大小的限制:

  • struts.multipart.maxSize掌控整个项目所上传文件的最大的Size,默认2M。超过了这个size,后台报错,程序处理不了如此大的文件
  • fileUpload拦截器的maximumSize属性必须小于struts.multipart.maxSize的值。

2)、struts.xml 还可以配置以下常量

    <!-- 系统常量定义,定义上传文件字符集编码 -->
    <constant name="struts.i18n.encoding" value="utf-8"></constant>
    <!-- 系统常量定义,定义上传文件临时存放路径 -->
    <constant name="struts.multipart.saveDir" value="F:\"></constant>

多文件上传

多文件的上传与单个文件的上传没有太大的不同。只需做简单的修改即可:

1、修改表单,提供多个文件上传域

    <s:form action="upload" method="post" enctype="multipart/form-data">
        <tr>
            <td>上传文件1:<s:file name="file"></s:file></td>
        </tr>
        <tr>
            <td>上传文件2:<s:file name="file"></s:file></td>
        </tr>
        <tr>
            <td align="left"><s:submit name="submit" value="提交"></s:submit></td>
        </tr>
    </s:form>

多个文件上传域的name属性必须相同,并且与Action的成员变量(private List< File> file;)同名

2、修改Action ,使之能够获取上传的所有文件

public class UploadAction extends ActionSupport {
    //上传文件存放路径
    private final static String UPLOADDIR = "/upload";
    //上传文件集合
    private List<File> file;
    //上传文件名集合
    private List<String> fileFileName;
    //上传文件内容类型集合
    private List<String> fileContentType;

    public String execute() throws Exception {
        int size = file.size();
        for (int i = 0; i < size ; i++) {
            //循环上传每个文件
            uploadFile(i);
        }
        return "success";
    }

    //执行上传功能
    private void uploadFile(int i) throws FileNotFoundException, IOException {
        try {
            InputStream in = new FileInputStream(file.get(i));
            String dir = ServletActionContext.getRequest().getRealPath(UPLOADDIR);
            File uploadFile = new File(dir, this.getFileFileName().get(i));
            OutputStream out = new FileOutputStream(uploadFile);
            byte[] buffer = new byte[1024];
            int length=0;
            while ((length = in.read(buffer)) > 0) {
                out.write(buffer, 0, length);
            }

            in.close();
            out.close();
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

参考链接:
http://www.oschina.net/code/snippet_105133_2208
http://blog.csdn.net/chow__zh/article/details/9288793
http://blog.csdn.net/xiazdong/article/details/7231977

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值