Загрузка и загрузка файлов в веб-приложении с использованием struts2 - PullRequest
1 голос
/ 13 марта 2010

В методах загрузки Struts2 я могу выбрать, где должен быть сохранен загруженный файл. Я имею в виду, что все примеры в Интернете просят меня хранить в 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;
    }

}

и 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)

Я пытаюсь, но не получаю никаких результатов ... что в этом плохого?

Ответы [ 2 ]

0 голосов
/ 19 марта 2010

Только что закончил реализовывать это сам. Я предлагаю решать две проблемы по отдельности. Сначала загрузите файл, затем загрузите файл. Непосредственная проблема с вашей поддержкой загрузки заключается в том, что у вас нет метода public getInputStream() для вашей конфигурации результатов:

<param name="inputName">inputStream</param>
0 голосов
/ 13 марта 2010

Чтобы записать InputStream в File, вам нужно FileOutputStream.

Чтобы получить InputStream от File, вам нужно FileInputStream.

В вашем коде вы пытаетесь выделить файл, используя ServletContext#getResourceAsStream(), но это предназначено для выделения ресурса classpath. Замените его на new FileInputStream(file).

...