簡體   English   中英

使用Java servlet的視頻下載/流

[英]Video download/stream using Java servlet

當客戶端訪問URL類似於此時,我試圖在我的服務器中下載視頻文件:

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

我試過這段代碼。 但它不起作用。 當我訪問servlet時,它只下載一個空白(0大小)文件。

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

我使用過BalusC的fileservlet教程,但在我的情況下,我沒有文件對象作為輸入流只是字節數組對象。

救命..

您找到的servlet確實不能用於流式傳輸視頻文件。 它更像是一個簡單的文件下載servlet,用於靜態文件,如PDF,XLS等。

許多視頻播放器要求服務器支持所謂的HTTP范圍請求。 即它必須能夠通過具有Range標頭的請求返回視頻文件的特定字節范圍。 例如,在10000字節長的文件上只有索引1000到2000的字節。 這是必須的,以便能夠足夠快地跳過特定范圍的視頻流而無需下載整個文件和/或通過創建多個HTTP連接來提高緩沖速度,每個HTTP連接請求視頻文件的不同部分。

然而,這是servlet中的許多附加代碼,需要很好地理解HTTP Range規范。 您找到的文件servlet的同一作者在此擴展文件servlet的風格中提供了一個隨時可用的示例。 在您的特定情況下,可能建議首先將文件保存到基於本地磁盤文件系統的緩存(例如,通過File#createTempFile()和HTTP會話中的某些鍵),這樣您就不需要再次從外部服務獲取它然后再次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM