如何写入HttpServletResponse对象?

时间:2023-01-21 14:57:32

I have this action class, this class takes care of my response

我有一个动作类,这个类负责我的反应

Update now passing response from DownloadStatus class, but it looks like it is null

Update现在从DownloadStatus类传递响应,但它看起来是空的

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  }
}

and below class to write stream into response

并在类下面写入流作为响应。

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
}

}

My question is how can ostr be returned to the response in DownloadStatus class?

我的问题是如何将ostr返回到DownloadStatus类的响应?

Update (working test servlet)

更新(工作测试servlet)

I have this below servlet which does the job of getting file content into a stream and giving it back to the HttpServletResponse, but i want to use it in above code

我有下面的servlet,它负责将文件内容导入流并返回给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());
        }
    }
 }

1 个解决方案

#1


4  

As far as I understand all you require is how to download a file using Struts2.

据我所知,您所需要的是如何使用Struts2下载文件。

You need something like this is your struts.xml file

你需要这样的东西这是你的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>

Code:

代码:

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;
  }
}

#1


4  

As far as I understand all you require is how to download a file using Struts2.

据我所知,您所需要的是如何使用Struts2下载文件。

You need something like this is your struts.xml file

你需要这样的东西这是你的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>

Code:

代码:

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;
  }
}