title: Video download/stream using Java servlet
body: <p>I am trying to download a video file in my server when the client access URL similar to this:</p>
  
  <pre><code>http://localhost:8088/openmrs/moduleServlet/patientnarratives/videoDownloadServlet?videoObsId=61
  </code></pre>
  
  <p>I have tried this code. But its not working. When i visit the servlet it only download a Blank (0 size) file.</p>
  
  <pre><code>protected void doGet(HttpServletRequest request, HttpServletResponse response)
          throws ServletException, IOException
  {
      try {
          Integer videoObsId = Integer.parseInt(request.getParameter("videoObsId"));
  
          Obs complexObs = Context.getObsService().getComplexObs(videoObsId, OpenmrsConstants.RAW_VIEW); 
          ComplexData complexData = complexObs.getComplexData();
          Object object2 = complexData.getData(); // &lt;-- an API used in my service. this simply returns an object.
  
          byte[] videoObjectData = SerializationUtils.serialize(object2);
  
          // Get content type by filename.
          String contentType = null;
          if (contentType == null) {
              contentType = "application/octet-stream";
          }
  
          // Init servlet response.
          response.reset();
          response.setBufferSize(DEFAULT_BUFFER_SIZE);
          response.setContentType(contentType);
          response.setHeader("Content-Length", String.valueOf(videoObjectData.length));
          response.setHeader("Content-Disposition", "attachment; filename=\"" + "test.flv" + "\"");
  
          // Prepare streams.
          BufferedInputStream input = null;
          BufferedOutputStream output = null;
  
          try {
              // Open streams.
              input = new BufferedInputStream(new ByteArrayInputStream(videoObjectData), DEFAULT_BUFFER_SIZE);              
              output = new BufferedOutputStream(response.getOutputStream(), DEFAULT_BUFFER_SIZE);
  
              // Write file contents to response.
              byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
              int length;
              while ((length = input.read(buffer)) &gt; 0) {
                  output.write(buffer, 0, length);
              }
          } finally {
              // Gently close streams.
              close(output);
              close(input);
          }
      }
  
      // Add error handling above and remove this try/catch
      catch (Exception e) {
          log.error("unable to get file", e);
      }
  }
  private static void close(Closeable resource) {
      if (resource != null) {
          try {
              resource.close();
          } catch (IOException e) {
              // Do your thing with the exception. Print it, log it or mail it.
              e.printStackTrace();
          }
      }
  }
  </code></pre>
  
  <p>I have used BalusC's <a href="http://balusc.blogspot.com/2007/07/fileservlet.html">fileservlet tutorial</a> but in my case i dont have file object as the inputstream just the byte array object.</p>
  
  <p>help..</p>