2012-01-12 16 views
5

Ho questa classe di azione, questa classe si prende cura di mia rispostaCome scrivere su un oggetto risposta HttpServletResponse?

Aggiornamento ora passando risposta da DownloadStatus classe, ma sembra che esso è nullo

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

e al di sotto della classe di scrivere flusso in risposta

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 
} 

} 

mia domanda è come si può ostr essere restituito al response inClasse?

Update (lavoro di test servlet)

ho questo sotto servlet che fa il lavoro di ottenere il contenuto del file in un flusso e dare di nuovo al HttpServletResponse, ma voglio usare nel codice sopra

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()); 
     } 
    } 
} 
+0

motivo per cui si giocare con ruscelli e Servlet API direttamente mentre può essere fatto con risultato flusso –

+0

' ostr' è 'OutputStream', ma' response' è 'HttpServletResponse'. Cosa intendi con * ostr restituito alla risposta *? –

+0

@Umesh: Non ho familiarità con il download di materiale! quindi quello che sono venuto a lavorare fuori @ prima sto seguendo, aiutami se c'è un modo migliore :) grazie – Ricky

risposta

4

Per quanto ne so, tutto ciò che serve è come scaricare un file utilizzando Struts2.

Hai bisogno di qualcosa come questo è il 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> 

Codice:

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

XCoder: Grazie mi ha aiutato a risolvere il mio problema – Ricky

+0

Primo esempio del motivo per cui il collegamento a fonti esterne è generalmente disapprovato. Link ora è morto e questa risposta ha poco senso. – thecoshman

+1

@thecoshman Ho aggiunto il codice di azione, spero che questo abbia senso ora. Scusa per il link non funzionante, l'ho rimosso. –

Problemi correlati