繁体   English   中英

使用struts2在网络应用程序中上传和下载文件

[英]File upload and Download in a web app using struts2

在struts2上载方法中,我可以选择上载文件的保存位置。 我的意思是,Web中的所有示例都要求我将其存储在WEB-INF中,这肯定不是一个好主意。 我希望能够将上传的文件存储在磁盘上的任何位置。

我该怎么办? 我可以借助ServletContextAware拦截器吗?

当我使用

public class DownloadFileAction extends ActionSupport implements ServletContextAware{
    //private InputStream inputStream;
    private int fileid;
    private ServletContext servletContext;
    private FileCrud fileCrud;
    private MyFile myFile;

    public FileCrud getFileCrud() {
        return fileCrud;
    }
    public void setFileCrud(FileCrud fileCrud) {
        this.fileCrud = fileCrud;
    }
    public MyFile getMyFile() {
        return myFile;
    }
    public void setMyFile(MyFile myFile) {
        this.myFile = myFile;
    }
    public InputStream getInputStream(){

        String homepath = "c:\\files";
        String fname = null;
        try{
            fname=getFileCrud().getAFileName(getFileid());
        }catch(Exception e){
            e.printStackTrace();
        }
        String thePathToFile = homepath+File.separator+fname;
        //File targetfile = new File(thePathToFile);

        return getServletContext().getResourceAsStream(thePathToFile);
    }
//  public void setInputStream(InputStream inputStream) {
//      this.inputStream = inputStream;
//  }
    public int getFileid() {
        return fileid;
    }
    public void setFileid(int fileid) {
        this.fileid = fileid;
    }
    public ServletContext getServletContext() {
        return servletContext;
    }
    public void setServletContext(ServletContext servletContext) {
        this.servletContext = servletContext;
    }
    public String execute(){
        return SUCCESS;
    }

}

和struts xml文件是

<action name="fileDownload" class="com.projit1.file.DownloadFileAction">
            <result type="stream" name="success">
                <param name="inputName">inputStream</param>
                <param name="contentType">application/octet-stream</param>

            </result>
        </action>

我收到以下错误

javax.servlet.ServletException: java.lang.IllegalArgumentException: Can not find a java.io.InputStream with the name [inputStream] in the invocation stack. Check the <param name="inputName"> tag specified for this action.
    org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:515)
    org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:419)

我正在尝试,但未得到任何结果。

要将InputStream写入File ,需要FileOutputStream

要从File获取InputStream ,需要FileInputStream

在您的代码中,您尝试使用ServletContext#getResourceAsStream()分配文件,但这旨在分配类路径资源。 new FileInputStream(file)替换它。

刚刚自己完成此操作。 我建议分别解决这两个问题。 先上传文件,然后下载文件。 下载支持的一个直接问题是,您的结果配置没有public getInputStream()方法:

<param name="inputName">inputStream</param>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM