struts 2中的文件下载

时间:2014-01-13 19:53:40

标签: java spring hibernate jsp struts2

我正在尝试从运行Struts2,Hibernate和Spring的Web服务器下载文件,但我总是遇到此异常。

java.lang.IllegalArgumentException: Can not find a java.io.InputStream with the name [inputName] in the invocation stack. Check the <param name="inputName"> tag specified for this action.
    org.apache.struts2.dispatcher.StreamResult.doExecute(StreamResult.java:237)
    org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:186)
    com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:371)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:275)
    org.apache.struts2.interceptor.DeprecationInterceptor.intercept(DeprecationInterceptor.java:41)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:256)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:167)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:265)
    org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:138)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:249)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:249)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:191)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:73)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:91)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:252)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:141)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:145)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:171)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:139)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:193)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:189)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    com.riteshsangwan.ossoc.core.interceptors.AuthenticationInterceptor.intercept(AuthenticationInterceptor.java:34)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54)
    org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:562)
    org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
    org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:99)

我检查了inputName参数并调试了项目,发现InputStream不为null。

这是下载类

inputName= new ByteArrayInputStream(mf.getFileContent());

这是struts 2 mapping

       <action name="downloadfile" class="com.riteshsangwan.ossoc.core.actions.DownloadFile">
            <result name="success" type="stream">

                <param name="inputName">inputName</param>
                <param name="contentDisposition">attachment;filename=${fileName}</param>
                <param name="contentType">${contentType}</param>
                <param name="bufferSize">1024</param>
                <param name="contentLength">${contentLength}</param>
                <param name="allowCaching">false</param>

            </result>
            <result name="input">/user/files.jsp</result>
        </action>

是因为ByteArrayInputStream或任何其他原因导致的异常。我有所有变量的公共getter和setter方法,我已经检查过它们都不是null。

编辑:DownloadFile类

package com.riteshsangwan.ossoc.core.actions;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.riteshsangwan.ossoc.core.dao.FilesBo;
import com.riteshsangwan.ossoc.core.entities.Files;
import com.riteshsangwan.ossoc.core.entities.Users;
import com.riteshsangwan.ossoc.core.util.MyFile;
import com.riteshsangwan.ossoc.core.util.Operations;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.context.ServletContextAware;


public class DownloadFile extends ActionSupport implements ServletContextAware{

    private long fid;
    private String contentType;
    private long contentLength;
    private String fileName;
    private InputStream inputName;


    private ServletContext context;
    private String downloadStatus;
    private String downloadpassword;
    private List fileList;
    private Map<String,Object> session;

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }


    public List getFileList() {
        return fileList;
    }

    public void setFileList(List fileList) {
        this.fileList = fileList;
    }


    public String getDownloadStatus() {
        return downloadStatus;
    }

    public void setDownloadStatus(String downloadStatus) {
        this.downloadStatus = downloadStatus;
    }

    public String getDownloadpassword() {
        return downloadpassword;
    }

    public void setDownloadpassword(String downloadpassword) {
        this.downloadpassword = downloadpassword;
    }

    public String getStatus() {
        return downloadStatus;
    }

    public void setStatus(String downloadStatus) {
        this.downloadStatus = downloadStatus;
    }

    @Autowired
    private FilesBo fbo;

    @Autowired
    private Operations operation;

    public Operations getOperation() {
        return operation;
    }

    public void setOperation(Operations operation) {
        this.operation = operation;
    }

    public FilesBo getFbo() {
        return fbo;
    }

    public void setFbo(FilesBo fbo) {
        this.fbo = fbo;
    }


    public long getFid() {
        return fid;
    }

    public void setFid(long fid) {
        this.fid = fid;
    }

    public String getContentType() {
        return contentType;
    }

    public void setContentType(String contentType) {
        this.contentType = contentType;
    }

    public long getContentLength() {
        return contentLength;
    }

    public void setContentLength(long contentLength) {
        this.contentLength = contentLength;
    }


    public InputStream getInputName() {
        return inputName;
    }

    public void setInputName(InputStream inputName) {
        this.inputName = inputName;
    }


    @Override
    public String execute(){
        String response;
        int a=10;
        try
        {
            session=ActionContext.getContext().getSession();
            Users u= (Users) session.get("user");
            long uid=u.getUid();
            fileList=fbo.getAllFiles(uid);
            Files f=getFbo().getFileWithData(getFid());
            MyFile mf=new MyFile();
            mf.setFileContent(f.getFileData());
            mf.setFileContentType(f.getFileContentType());
            mf.setFileHash(f.getFileHash());
            mf.setFileName(f.getFileName());
            mf.setFileSize(f.getFileSize());
            mf.setPassword(downloadpassword);
            mf=operation.decrypt(mf);

            fileName=mf.getFileName();
            contentLength=mf.getFileSize();
            contentType=mf.getFileContentType();

            inputName=new ByteArrayInputStream(mf.getFileContent());

            response=ActionSupport.SUCCESS;
        }
        catch(IOException e)
        {
            if(e.getMessage().equalsIgnoreCase("Message has been altered or password incorrect"))
            {
                downloadStatus="Message has been altered or incorrect password. Try again.";
            }
            response=ActionSupport.INPUT;
        }
        catch(Exception e)
        {
            downloadStatus="Some error occured. Try Again";
            response=ActionSupport.INPUT;
        }
        return response;
    }

    @Override
    public void setServletContext(ServletContext servletContext) {
        this.context=servletContext;
    }

}

3 个答案:

答案 0 :(得分:2)

好的,将inputName更改为inputStream。喜欢这个

private InputStream inputStream;

public InputStream getInputStream() {
    return inputStream;
}

public void setInputStream(InputStream inputStream) {
    this.inputStream= inputStream;
}

参数inputName的默认设置为inputStream,因此,您可以将其删除。另请注意,结果中的参数名称在值堆栈中查找。因此,如果在操作中公开类似getInputName的getter,则意味着您要覆盖配置中的值。

答案 1 :(得分:0)

确保getInputName()方法不返回null,如果返回null,则会发生此异常。

此异常的描述具有误导性,它会让您觉得您的inputName参数配置的名称是错误的。但是,实际原因是getInputName()&return;返回InputStream为空。

答案 2 :(得分:0)

            

            <param name="inputName">inputName</param>
            <param name="contentDisposition">attachment;filename=${fileName}</param>
            <param name="contentType">${contentType}</param>
            <param name="bufferSize">1024</param>
            <param name="contentLength">${contentLength}</param>
            <param name="allowCaching">false</param>


             *<!--add a iuputStream-->
            <param name="inputStream">inputName</param>*

        </result>
        <result name="input">/user/files.jsp</result>
    </action>