2012-01-12 12 views
5

मैं इस कार्रवाई वर्ग है, इस वर्ग मेरी प्रतिक्रियाएक HttpServletResponse प्रतिक्रिया ऑब्जेक्ट को कैसे लिखें?

अद्यतन अब 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 } 
} 

और वर्ग में धारा लिखने के नीचे है प्रतिक्रिया

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 
} 

} 

मेरा प्रश्न कैसे ostrमें response को वापस किया जा सकता हैकक्षा?

अद्यतन (परीक्षण सर्वलेट काम)

मैं सर्वलेट जो एक धारा में फ़ाइल की सामग्री हो रही है और 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()); 
     } 
    } 
} 
+0

तुम क्यों नदियों और सर्वलेट एपीआई के साथ प्रयोग करना सीधे जबकि यह धारा परिणाम –

+0

'साथ किया जा सकता ostr' 'आउटपुटस्ट्रीम 'है, लेकिन' प्रतिक्रिया' 'HttpServletResponse' है। * Ostr प्रतिक्रिया के साथ वापस लौटने के साथ आपका मतलब क्या है? –

+0

@ उमेश: मैं सामान डाउनलोड करने से परिचित नहीं हूं! तो मैं पहले काम करने के लिए आया था @ पहले मैं इसका अनुसरण कर रहा हूं, अगर कोई बेहतर तरीका है तो मेरी मदद करें :) धन्यवाद – Ricky

उत्तर

4

जहाँ तक मुझे समझ में आता है कि स्ट्रूट 2 का उपयोग कर फ़ाइल डाउनलोड करने का तरीका है।

आप कुछ इस तरह की जरूरत है अपने 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; 
    } 
} 
+0

एक्सकोडर: धन्यवाद, इससे मेरी समस्या हल हो गई है – Ricky

+0

बाहरी स्रोतों को जोड़ने का मुख्य उदाहरण आम तौर पर क्यों फहराया जाता है। लिंक अब मर चुका है, और यह जवाब थोड़ा समझ में आता है। – thecoshman

+1

@thecoshman मैंने एक्शन कोड जोड़ा है, उम्मीद है कि यह अब समझ में आता है। टूटी हुई लिंक के लिए खेद है, मैंने इसे हटा दिया है। –

संबंधित मुद्दे