2012-01-12 15 views
5

mam tej klasy działania, ta klasa dba o moją odpowiedźJak pisać do obiektu odpowiedzi HttpServletResponse?

aktualizacji teraz przechodzącej odpowiedź od DownloadStatus klasy, ale wygląda na to, że jest 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 } 
} 

i poniżej klasie pisania strumień do odpowiedź

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 
} 

} 

Moje pytanie brzmi: w jaki sposób można ostr zostać zwrócony do response w DownloadStatus klasy?

Update (działa aplet test)

mam to poniżej serwletu, który wykonuje pracę coraz zawartość pliku do strumienia i dając go z powrotem do HttpServletResponse, ale chcę go używać w powyższym kodzie

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

dlaczego gry z potoków i Servlet API bezpośrednio, podczas gdy można to zrobić z wynikiem strumienia –

+0

' ostr' to 'OutputStream', ale' response' to 'HttpServletResponse'. Co masz na myśli, gdy * ostr powrócił do odpowiedzi *? –

+0

@Umesh: Nie jestem zaznajomiony z pobieraniem rzeczy! więc to, do czego doszedłem do pracy @ najpierw podążam za nim, pomóż mi, jeśli jest lepszy sposób :) dzięki – Ricky

Odpowiedz

4

O ile rozumiem, wszystko, czego potrzebujesz, to jak pobrać plik za pomocą Struts2.

Trzeba coś takiego jest plik 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> 

Kod:

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: Dzięki temu pomógł mi rozwiązać mój problem – Ricky

+0

Podstawowy przykład dlaczego linki do zewnętrznych źródeł są ogólnie mile widziane. Link jest już martwy, a ta odpowiedź nie ma większego sensu. – thecoshman

+1

@thecoshman Dodałem kod akcji, mam nadzieję, że teraz ma to sens. Przepraszamy za uszkodzony link, usunąłem go. –

Powiązane problemy