程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了使用Java Servlet的视频下载/流大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决使用Java Servlet的视频下载/流?

开发过程中遇到使用Java Servlet的视频下载/流的问题如何解决?下面主要结合日常开发的经验,给出你关于使用Java Servlet的视频下载/流的解决方法建议,希望对你解决使用Java Servlet的视频下载/流有所启发或帮助;

您发现的servlet实际上不适合用于流传输视频文件。它更适合作为简单文件下载servlet,用于处理pdf,XLS等静态文件。

许多视频播放器要求服务器支持所谓的http范围请求。也就是说,它必须能够通过带有Range标头的请求返回视频文件的特定字节范围。例如,在10000字节长的文件上,只有从索引1000到2000的字节。这是必须的,以便能够足够快地跳过视频流的特定范围,而无需下载整个文件和/或通过创建多个http连接来提高缓冲速度,每个请求都请求视频文件的不同部分。

但是,这是servlet中的许多其他代码,需要对httpRange规范有充分的了解。由您发现的文件Servlet的同一作者以扩展文件servlet的形式提供了一个立即可用的示例。在您的特定情况下,建议您首先将文件保存到基于本地磁盘文件系统的缓存中(例如,通过file#createTempfile()http会话中的某个键),这样就无需一次又一次从外部服务获取文件。

解决方法

当客户端访问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,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教程,但在我的情况下,我没有文件对象作为输入流,而只是字节数组对象。

帮帮我..

大佬总结

以上是大佬教程为你收集整理的使用Java Servlet的视频下载/流全部内容,希望文章能够帮你解决使用Java Servlet的视频下载/流所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。