2010-03-13 58 views
1

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

我该怎么做?我可以在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) 

我想,但我没有得到任何结果..什么这是错的吗?

回答

0

要将InputStream写入File,您需要FileOutputStream

要从File获得InputStream,您需要FileInputStream

在您的代码中,您尝试使用ServletContext#getResourceAsStream()来分配文件,但这样做是为了分配类路径资源。将其替换为new FileInputStream(file)

0

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

<param name="inputName">inputStream</param> 
相关问题