使用Struts上传图像

时间:2014-09-09 07:59:25

标签: java jsp file-upload struts2

我刚开始练习struts,所以我对这个框架有点新意。所以,我要做的是使用这个JSP文件上传图像:

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>

<html>
  <head>
    <title>Upload User Image</title>
  </head>

  <body>
    <h2>Struts2 File Upload &amp; Save Example</h2>

    <s:actionerror />
    <s:form action="imageinsert.action" method="post" enctype="multipart/form-data">

      <td>Image : </td><td><input type="file" name="Image"></td> 
      <s:submit value="Upload" align="center" />
    </s:form>
  </body>
</html>

动作类如下:

public class InsertImageBean extends ActionSupport{

    private static final long serialVersionUID = 1L;

    private File Image;
    private String myFileContentType;
    private String myFileFileName;

    public String execute()
    {
        /* Copy file to a safe location */

        InsertImage.save(this);

        return SUCCESS;
    }
    public File getMyFile() {
        return Image;
    }
    public void setMyFile(File myFile) {
        this.Image = myFile;
    }
    public String getMyFileContentType() {
        return myFileContentType;
    }
    public void setMyFileContentType(String myFileContentType) {
        this.myFileContentType = myFileContentType;
    }
    public String getMyFileName() {
        return myFileFileName;
    }
    public void setMyFileName(String myFileFileName) {
        this.myFileFileName = myFileFileName;
    }
}

bean类如下:

public class InsertImage {

    public static int save(InsertImageBean iib) {
        try{
            String filepath = "D:/TEAMWORK/NaTelangana/WebContent/Images";
            File image = iib.getMyFile();
            String myfilename = iib.getMyFileName();
            System.out.println("Src File name: " + iib.getMyFileName());
            System.out.println("Dst File name: " + myfilename);

            File destFile  = new File(filepath, myfilename); // Null pointer exception is thrown here
            FileUtils.copyFile(image, destFile);

            System.out.println(System.getProperty("user.dir") );

            if(image.renameTo(new File(filepath)))
                System.out.println("File is moved successful!");
            else
                System.out.println("Failed to move!");
        }catch(Exception e){
            e.printStackTrace();
        }
        return 0;
    }
}

问题是,在上面的程序中,我在上面的程序中得到一个NullPointerException

File destFile  = new File(filepath, myfilename);

问题是bean文件中没有收到发送的输入。如何纠正此错误?

这是我得到的错误:

java.lang.NullPointerException
    at java.io.File.<init>(File.java:317)
    at natelangana.com.InsertImage.save(InsertImage.java:23)
    at bean.com.InsertImageBean.execute(InsertImageBean.java:26)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:440)
    at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:279)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242)Src File name: null
Dst File name: null

    at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:163)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:249)
    at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:122)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:148)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:93)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:306)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:89)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:128)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    at org.apache.struts2.interceptor.ProfilingActivationInterceptor.intercept(ProfilingActivationInterceptor.java:104)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:126)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:138)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:148)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:128)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:306)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
    at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:468)
    at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:395)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)

3 个答案:

答案 0 :(得分:1)

  1. 将输入名称更改为以小写字母开头:

    <input type="file" name="image">
    
  2. 然后在Action中,您需要将File变量的名称添加到contentType和FileName字符串中,如下所示:

    private File image;
    private String imageContentType;
    private String imageFileName;
    
    /* GETTERS AND SETTERS FOR ALL OF THEM */
    
  3. 您可能也对how to configure the maximum size for a single file(以及整个请求),allow only certain kind of files上传或upload multiple files at once感兴趣。

    修改

    您没有发布struts.xml和web.xml配置,而是发布了堆栈跟踪的行

      

    at org.apache.struts2.dispatcher。 FilterDispatcher .doFilter(FilterDispatcher.java:395)

    推出you are using the wrong Filter

    此外,文件上传拦截器似乎被配置为运行两次......这通常在以错误方式配置时发生,例如

    <!-- WRONG  -->
    <interceptor-ref name="fileUpload">
        <param name="maximumSize">2097152</param>
        <param name="allowedTypes">
            image/png,image/gif,image/jpeg,image/pjpeg
        </param>            
    </interceptor-ref>
    <interceptor-ref name="defaultStack" />
    

    而不是

    <!-- RIGHT  -->
    <interceptor-ref name="defaultStack">
        <param name="fileUpload.maximumSize">2097152</param>
        <param name="fileUpload.allowedTypes">
            image/png,image/gif,image/jpeg,image/pjpeg
        </param>            
    </interceptor-ref>
    

    再次,在web.xml和struts.xml中仔细检查您的配置,它将自动运行。

答案 1 :(得分:0)

尝试使用<s:file name="Image"/>代码而不是普通<input/>

答案 2 :(得分:0)

您可以从简单file upload example开始,然后就可以看到上传文件的存储位置。如果您设置了上传的文件名,则可以复制文件。您可以在开始保存之前阻止空指针异常。

if (myFileFileName != null)
  InsertImage.save(this);  

您还可以添加required验证程序,以便在执行操作之前检查字段值。