Struts2 文件上传


要求:

使用struts上传文件。首先你要是个基础的struts项目。要有struts.xml,相关jar包,以及再web.xml中配置好。


该篇文章能帮助你那些?
1. 你将知道如何使用struts上传。
2. 你将知道struts在上传文件中要注意到那些细节。
3. 你知道如何配置文件,设定上传要求


1. 步骤

步骤:
前台配置–后台配置

前台配置要求:

jsp页面(fileUpl.jsp);

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

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'xx.jsp' starting page</title>

    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

  </head>

  <body>
    <form action="../fileUpload_s" method="post" enctype="multipart/form-data">
        文件:<input type="file" name="f1" /><br/>
        <input type="submit" value="提交"/>
    </form> <br>
  </body>
</html>

因为我放在:这里写图片描述
所以form中的action是../fileUpload_s。


后台配置要求:

struts.xml配置:

    <package name="upload" extends="struts-default" namespace="/">
        <action name="fileUpload_s" class="cn.upload.Uploads" >
            <result>/success.jsp</result>
            <result name="input">/error.jsp</result>
        </action>
    </package>

Action:

package cn.upload;

import java.io.File;

import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class Uploads extends ActionSupport {
    //对应表单
    private File f1;
    //对应文件名(格式是input[name]中的name与FileName组合)
    private String f1FileName;
    //MIMe类型
    private String f1ContentType;


    public void setF1(File f1) {
        this.f1 = f1;
    }


    public void setF1FileName(String f1FileName) {
        this.f1FileName = f1FileName;
    }


    public void setF1ContentType(String f1ContentType) {
        this.f1ContentType = f1ContentType;
    }



    @Override
    public String execute() throws Exception {
        // TODO Auto-generated method stub
        File destFile = new File(ServletActionContext.getRequest().getRealPath("/file"),f1FileName);
        FileUtils.copyFile(f1, destFile);
        System.out.println("f1_name:"+f1FileName);
        System.out.println("f1ContentType:"+f1ContentType);
        return super.execute();
    }
}

页面上传之后,控制台结果(上传了两种文件):

f1_name:Myec-快捷键.txt
f1ContentType:text/plain
f1_name:jwn.sql
f1ContentType:application/octet-stream

上传之后的文件放在tomcat\webapps\项目名\webroot\file的目录中

总结:

  1. *.jsp文件的form中,method="post" enctype="multipart/form-data"。form中的input[name]中name要与Action的属性相对应。并且form中的action不能是“fileUpload”。原因是一些拦截器中有fileUpload名,如果有,容易出现错误。尽量不要使用。
    这里写图片描述

  2. Action中获取上下文路径通过servletApi获取,ServletActionContext获得getRealPath(“/upload_place_name”);
    如:我放置在webroot下的file文件之下,

File destFile = new File(ServletActionContext.getRequest().getRealPath("/file"),f1FileName);
  1. Action中的fiilenameContextType对应的是浏览器的MiMe。如果要查其他的请到tomcat\config\web.xml中查找。

  2. Action中的错误会return INPUT。所以在Struts.xml中需要配置<result name="input">/error.jsp</result>


拓展

如何限制文件上传的类型?
原理:
限制文件上传一定要在Action的操作之前,也就是说不能让不允许上传的文件上传到服务器,Action是实现不了文件上传到服务器的限制。即在Action中加限制类型是不可以的,只能在配置文件中添加限制。

那如何限制?我们没有常量可以修改,但是我们有个fileUpload拦截器,我们可以对拦截器添加一些参数。
这里写图片描述
这里写图片描述

对此处操作。那么我们就可以修改上传类型。那我如何修改?
请看struts.xml中:

    <package name="upload" extends="struts-default" namespace="/">
        <action name="fileUpload_s" class="cn.upload.Uploads" >
            <!-- 此处是限制文件类型 -->

            <!-- 对于Action和拦截器的先后就可以得出结论!!! -->
            <!-- 每一个对Action请求都会执行拦截器,如果没有定义拦截器,将会默认执行defaultStack拦截器栈 -->
            <!-- 因此,在Action和拦截器的先后顺序中,应该是Action先创建再拦截器执行 -->
            <!-- 即,cn.upload.Uploads(Action)先于拦截器 -->
            <interceptor-ref name="defaultStack">
                <!-- 拓展名,后缀 -->
                <param name="fileUpload.allowedExtensions">txt,jpg</param>

                <!-- 请到tomcat的config文件的web.xml中找Mime类型名 -->
                <!-- <param name="fileUpload.allowedTypes"></param> -->

                <!-- 以上两个param可以同时使用,但是会取交集。也就是说,相同的则允许,不同的将拒绝 -->
            </interceptor-ref>
            <result>/success.jsp</result>
            <result name="input">/error.jsp</result>
        </action>
    </package>

如果限制成功将会出现:

警告: Content-Type not allowed: f1 "IMG_20160322_191655.jpg" "upload_75fd441f_9847_4820_acdc_bb9b15dc9ec4_00000001.tmp" image/jpeg

如何改变上传文件的大小限制?(默认是2M)
1. 在struts.xml中修改常量:

    <!-- 40M大小  -->
    <constant name="struts.multipart.maxSize" value="41943040"/>
  1. 在struts.properties中添加或修改为:
struts.multipart.maxSize=41943040

补充:如何找到一些常量?
这里写图片描述

  1. 另一种在struts.xml中修改方式(不建议使用)。在上一问(限制上传类型中),我们可以在struts.xml中添加这条代码:
<param name="fileUpload.maximumSize">41943040</param>

疑问

继单个文件上传,之后多个文件上传怎么办? 请看我写的几篇相关的文章。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值