struts2 文件上传时,某次上传失败之后的所有上传都返回input,不跳到action

2019-03-25 13:50|来源: 网路

在做文件上传时,不加限制上传任意类型文件都成功,但是如果加了“allowedTypes”限制文件类型后,上传正确类型成功,上传错误类型失败,这些都是理所当然的结果。问题是上传错误类型失败后,再上传正确的文件,也跳转到input视图,不经过action。如限制只能上传gif格式文件,第一次上传gif图片返回success;第二次上传非gif文件,返回input;第三次上传gif文件,还是返回input,怎么解决?
代码如下:
jsp页面:    <s:form action ="fileUpload" method ="POST" enctype ="multipart/form-data" >
             <s:file name ="myFile" label ="Image File" />
             <s:textfield name ="caption" label ="Caption" />       
             <s:submit/>
action:
package ss2h.Action;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class FileUploadAction extends ActionSupport {
    private static final long serialVersionUID = 572146812454l ;
    private static final int BUFFER_SIZE = 16 * 1024 ;
  
    private File myFile;
    private String contentType;
    private String fileName;
    private String imageFileName;
    private String caption;
  
    public void setMyFileContentType(String contentType) {
        this .contentType = contentType;
   }
  
    public void setMyFileFileName(String fileName) {
        this .fileName = fileName;
   }
      
    public void setMyFile(File myFile) {
        this .myFile = myFile;
   }
  
    public String getImageFileName() {
        return imageFileName;
   }
  
    public String getCaption() {
        return caption;
   }

    public void setCaption(String caption) {
        this .caption = caption;
   }
  
    private static void copy(File src, File dst) {
        try {
           InputStream in = null ;
           OutputStream out = null ;
            try { 
           
            if (dst.getParentFile() != null
&& dst.getParentFile().exists() == false) {
if (dst.getParentFile().mkdirs() == false) {
throw new IOException("Destination '" + dst
+ "' directory cannot be created");
}
}
           
            //文件不会自动保存到服务器,必须通过流操作
               in = new BufferedInputStream( new FileInputStream(src), BUFFER_SIZE);
               out = new BufferedOutputStream( new FileOutputStream(dst), BUFFER_SIZE);
                byte [] buffer = new byte [BUFFER_SIZE];
                while (in.read(buffer) > 0 ) {
                   out.write(buffer);
               }
           } finally {
                if ( null != in) {
                   in.close();
               }
                if ( null != out) {
                   out.close();
               }
           }
       } catch (Exception e) {
           e.printStackTrace();
       }
   }
  
    private static String getExtention(String fileName) {
        int pos = fileName.lastIndexOf(".");
        return fileName.substring(pos);
   }

   @Override
    public String execute()     {       
       imageFileName = new Date().getTime() + getExtention(fileName);
       File imageFile = new File(ServletActionContext.getServletContext().getRealPath( "/UploadImages" ) + "/" + imageFileName);
       copy(myFile, imageFile);
       System.out.println("haha");
        return SUCCESS;
   }
  
}

struts.xml:
<package name ="fileUploadDemo" extends ="struts-default" >
        <action name ="fileUpload" class ="FileUploadAction" >           
              <!-- 验证上传文件的类型 -->    
            <interceptor-ref name ="defaultStack">     
                <param name ="fileUpload.allowedTypes">image/gif</param>      
            </interceptor-ref>                     
            <result name ="input"> /fail.jsp </result >
            <result name ="success"> /success.jsp </result >
        </action >
    </package >
applicationContext.xml:
<bean id="FileUploadAction" class="ss2h.Action.FileUploadAction">
</bean>

web.xml:
<filter>
  <filter-name>struts2</filter-name>
  <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
  </filter>
  <filter-mapping>
  <filter-name>struts2</filter-name>
  <url-pattern>/*</url-pattern>
  </filter-mapping>
 
  <filter >
        <filter-name > struts-cleanup </filter-name >
        <filter-class >
            org.apache.struts2.dispatcher.ActionContextCleanUp
        </filter-class >
    </filter >  
    <filter-mapping >
        <filter-name > struts-cleanup </filter-name >
        <url-pattern > /* </url-pattern >
    </filter-mapping >
   
  <listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

相关问答

更多
  • struts2 作用[2022-09-12]

    作为web层框架应该大体实现以下功能: 1.获取表单内容,并组织生成参数对象 2.根据请求的参数转发请求给适当的控制器 3.在控制器中调用业务接口 4.将业务接口返回的结果包装起来发送给指定的视图,并由视图完成处理结果的展现 5.做一些简单的校验或是国际化工作 无论是登录还是上传什么,没有其他层的协助是无法实现的,当然你也可以硬编码的来实现业务逻辑或数据库操作,这样的做法扩展性和可维护性极差 hibernate是操作数据库的一种框架,它简化了直接使用jdbc api的代码操作数据库的复杂性和冗余性 spri ...
  • 放到SRC下。如果struts.xml里带有INCLUDE标签 则放到对应的包下面。
  • struts2 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter struts2 /*
  • struts2 *.action
  • Struts2注解[2022-10-17]

    @Action(value="/backend/info/commodity/list", results={@Result(name="success",location="/backend/info/commodity/commodity_list.jsp"),@Result(name="error",location="....")}) public String list(){ return SUCCESS; }
  • 尝试: request.getHeader("referer"); 您还可以在表单中创建隐藏字段,然后使用if语句进行相应的检查和路由。 我建议你使用隐藏字段。 虽然它当然更麻烦,但它也更可靠。 可以通过代理从HTTP头中剥离referer字段。 事实上,浏览器根本不需要在标题中发送referer字段。 在这里看一个很好的讨论。 以上说明是该讨论的摘录。 Try: request.getHeader("referer"); You can also create a hidden field i ...
  • 一个Struts(Struts1 / Struts经典)动作更多地与一个servlet相关联。 在Struts2中,情况完全不同。 Struts2操作只是一个POJO(纯Java类),完全与Servlet API分离。 这种解耦方便了测试。 在Struts2 webapp的典型工作流中,将为每个请求实例化一个动作,并将与一个Servlet相关联(如果需要了解这种关联,它可以实现ServletAware接口;通常这不是必需的也不可取的)。 与Servlet(和Struts动作)有一个重要的概念上的区别是Str ...
  • 忘记插件吧,它没有Struts 1.x那么有用,并且没有任何插件能够为Struts2提供全面的支持。 但是,Struts2拥有自己的插件库。 而且他们每个人的工作方式都不一样,你必须学习文档和例子。 Forget about plugin, it's not so much useful as in Struts 1.x, and there's no any plugin that is able to provide full support for Struts2. However, Struts2 ...
  • 该process在操作执行之前运行。 覆盖框架类的目的是更改/扩展功能。 大多数修改都与旧框架有关,可以删除。 如果你需要使用一些在Struts2中无法替换的代码,那么你应该编写一个自定义拦截器。 这是更改/扩展Struts2中的功能而不是类覆盖的常用方法。 您可以在Struts docs站点上阅读有关拦截器的更多信息。 你应该对你的架构很好,但ModelDriven可以用注入bean代替到控制器中。 设置bean时请参阅Nullpointerexception 。 有时bean的范围很重要,例如Strut ...