2013-09-02 91 views
6

Tôi cố gắng để tải về một tập tin video trong máy chủ của tôi khi URL truy cập của khách hàng tương tự như sau:video download/suối sử dụng Java servlet

http://localhost:8088/openmrs/moduleServlet/patientnarratives/videoDownloadServlet?videoObsId=61 

Tôi đã thử mã này. Nhưng nó không hoạt động. Khi tôi truy cập vào servlet nó chỉ tải về một tập tin trống (0 kích thước).

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

Tôi đã sử dụng BalusC của fileservlet tutorial nhưng trong trường hợp của tôi, tôi không có đối tượng tập tin như inputstream chỉ là đối tượng mảng byte.

trợ giúp ..

+1

Và bạn đã kiểm tra giá trị của 'videoObjectData' để xem nội dung trong đó sau khi bạn khởi tạo? – chrylis

+0

có, 'videoObjectData' chứa dữ liệu được khởi tạo – harshadura

Trả lời

7

Servlet mà bạn thấy thực sự không phù hợp với mục đích phát trực tuyến tệp video. Nó có ý nghĩa hơn như một servlet tải xuống tệp đơn giản cho các tệp tĩnh như PDF, XLS, v.v.

Rất nhiều trình phát video yêu cầu máy chủ hỗ trợ các yêu cầu phạm vi HTTP. I E. nó phải có khả năng trả về một dải byte cụ thể của tệp video theo yêu cầu với tiêu đề Range. Ví dụ: chỉ các byte từ chỉ mục 1000 đến 2000 trên một tệp dài 10000 byte. Điều này là bắt buộc để có thể bỏ qua một phạm vi nhất định của luồng video đủ nhanh mà không cần tải xuống toàn bộ tệp và/hoặc cải thiện tốc độ đệm bằng cách tạo nhiều kết nối HTTP mà mỗi yêu cầu một phần khác nhau của tệp video.

Tuy nhiên, đây là nhiều mã bổ sung trong servlet yêu cầu hiểu rõ về đặc điểm HTTP Range. Ví dụ sẵn sàng để sử dụng được cung cấp theo hương vị của extended file servlet này bởi chính tác giả của tệp servlet mà bạn đã tìm thấy. Trong trường hợp cụ thể của bạn, có thể nên lưu tệp vào bộ nhớ cache dựa trên hệ thống tệp cục bộ trước (ví dụ: File#createTempFile() và một số khóa trong phiên HTTP), do đó bạn không cần phải lấy nó từ dịch vụ bên ngoài một lần nữa.

+1

Cảm ơn bó @BalusC, nó hoạt động ngay bây giờ bằng cách sử dụng tệp tải xuống servlet mới nhất của bạn với phương pháp tiếp cận tệp tạm thời java thay vì truyền đối tượng mảng byte. giải pháp: https://gist.github.com/harshadura/6420565 – harshadura

Các vấn đề liên quan