web-dev-qa-db-ja.com

HttpServletResponse応答オブジェクトに書き込む方法は?

私はこのアクションクラスを持っています、このクラスは私の応答を処理します

更新DownloadStatusクラスからの応答を渡すようになりましたが、nullのようです

public final class DownloadStatus extends ActionSupport implements ServletRequestAware,ServletResponseAware
{
    static Logger logger = Logger.getLogger(DownloadStatus.class);
    private HttpServletRequest request;
    private HttpServletResponse response;
    private File cfile;
    private String cfileFileName;

    @Override
    public String execute() 
    {

        logger.debug("Inside DownloadStatus.execute method")

        try {
            ChainsInvoker invoker = new ChainsInvoker()
            def executionResponse = invoker.invoke(request, MYChains.download, cfile, cfileFileName)
            if(executionResponse == null || ErrorHandler.checkIfError(executionResponse))
            {
                return ERROR
            }
            response.setContentType("APPLICATION/xml")

            logger.debug("filename: $cfileFileName")

            response.addHeader("Content-Disposition", "attachment; filename=\""+cfileFileName+"\"")
            response.getWriter().print(executionResponse)
            logger.debug("executionResponse :" + executionResponse)
            invoker.invoke(MYChains.clean)
        }catch (Exception exp) {

            logger.error("Exception while Creating Status ")
            logger.error(exp.printStackTrace())

        }
        return NONE
    }

    @Override
    public void setServletRequest(HttpServletRequest request) {     this.request = request; }

    @Override
    public void setServletResponse(HttpServletResponse response) {      this.response = response;   }

    public File getcfile()  {       cfile   }

    public void setcfile(File cfile)    {       this.cfile = cfile  }

    public String getcfileFileName()    {       cfileFileName   }

    public void setcfileFileName(String cfileFileName){     this.cfileFileName = cfileFileName  }
}

ストリームを応答に書き込むクラスの下

class DownloadStatusResponse implements Command {   

static Logger logger = Logger.getLogger(DownloadStatusResponse.class);
@Override
public boolean execute(Context ctx) throws Exception 
{
    logger.debug("Inside DownloadStatusResponse.execute() method")
    OutputStream response = null;

    if(ctx.get(ContextParams.absFileName) != null && ctx.get(ContextParams.absFileName).toString().trim().length() != 0 )
    {
HttpServletResponse resp = ctx.get(ContextParams.response)
/*I am trying to get Response here*/

        response=downloadStatusFile(ctx.get(ContextParams.absFileName).toString(),resp)
    }

    logger.debug("Response: " + response)
    ctx.put(ContextParams.response,response);   /*ContextParams is a enum of keywords, having response*/
    return false;
}

private OutputStream downloadStatusFile(String filename,HttpServletResponse resp)
{
    logger.info("Inside downloadStatusFile() method")

    File fname = new File(filename)
    if(!fname.exists())
    {   
        logger.info("$filename does not exists")
        return null
    }
    else
    {

        resp.setContentType("APPLICATION/xml")
/*Exception: cannot setContentType on null object*/

        resp.addHeader("Content-Disposition", "attachment; filename=\""+fname.getName()+"\"")

        FileInputStream istr = new FileInputStream(fname)
        OutputStream ostr = resp.getOutputStream()
        /*I need to use resp.getOutputStream() for ostr*/

        int curByte=-1;

        while( (curByte=istr.read()) !=-1)
            ostr.write(curByte)

        ostr.flush();           
    }               
    return ostr
}

}

私の質問は、ostrresponseクラスのDownloadStatusに戻すにはどうすればよいですか?

更新(動作テストサーブレット)

ファイルコンテンツをストリームに取得してHttpServletResponseに返すジョブを実行する以下のサーブレットがありますが、上記のコードで使用したいと思います。

    public class DownloadServlet extends HttpServlet {


public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {

    String fileName = req.getParameter("zipFile");

    if(fileName == null)      return;

        File fname = new File(fileName);
        System.out.println("filename"); 
        if(!fname.exists())  {System.out.println("Does not exists");            return;}

        FileInputStream istr = null;
        OutputStream ostr = null;
        //resp.setContentType("application/x-download");
        resp.setContentType("APPLICATION/Zip"); 
        resp.addHeader("Content-Disposition", "attachment; filename=\""+fname.getName()+"\"");
        System.out.println(fname.getName()); 
        try {  
          istr = new FileInputStream(fname);
          ostr = resp.getOutputStream();
          int curByte=-1;

                while( (curByte=istr.read()) !=-1)
                    ostr.write(curByte);

          ostr.flush();
        } catch(Exception ex){
          ex.printStackTrace(System.out);
        } finally{
          try {
            if(istr!=null)  istr.close();
            if(ostr!=null)  ostr.close();
          } catch(Exception ex){

              ex.printStackTrace();
            System.out.println(ex.getMessage());
          }
        }  
        try {
            resp.flushBuffer();
        } catch(Exception ex){
            ex.printStackTrace();
            System.out.println(ex.getMessage());
        }
    }
 }
6
user801116

私が理解している限り、必要なのはStruts2を使用してファイルをダウンロードする方法だけです。

あなたはこのようなものがあなたのstruts.xmlファイルである必要があります

<action name="downloadfile" class="DownloadAction">
           <result name="success" type="stream">
               <param name="contentType">application/pdf</param>
               <param name="inputName">inputStream</param>
               <param name="contentDisposition">attachment;filename="document.pdf"</param>
               <param name="bufferSize">1024</param>
           </result>
       </action>

コード:

public class DownloadAction extends ActionSupport {

  private InputStream inputStream;

  public InputStream getInputStream() {
    return inputStream;
  }

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

  public String execute() throws FileNotFoundException {
    String filePath = ServletActionContext.getServletContext().getRealPath("/uploads");
    File f = new File(filePath + "/nn.pdf");
    System.out.println(f.exists());
    inputStream = new FileInputStream(f);
    return SUCCESS;
  }
}
3
coding_idiot