Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JavaServlet的视频下载/流_Java_Jsp_Servlets_Video_Download - Fatal编程技术网

使用JavaServlet的视频下载/流

使用JavaServlet的视频下载/流,java,jsp,servlets,video,download,Java,Jsp,Servlets,Video,Download,当客户端访问类似以下内容的URL时,我正在尝试在服务器中下载视频文件: http://localhost:8088/openmrs/moduleServlet/patientnarratives/videoDownloadServlet?videoObsId=61 我试过这个代码。但它不起作用。当我访问servlet时,它只下载一个空白(0大小)文件 protectedvoid doGet(HttpServletRequest请求,HttpServletResponse响应) 抛出Servle

当客户端访问类似以下内容的URL时,我正在尝试在服务器中下载视频文件:

http://localhost:8088/openmrs/moduleServlet/patientnarratives/videoDownloadServlet?videoObsId=61
我试过这个代码。但它不起作用。当我访问servlet时,它只下载一个空白(0大小)文件

protectedvoid doGet(HttpServletRequest请求,HttpServletResponse响应)
抛出ServletException、IOException
{
试一试{
整数videoObsId=Integer.parseInt(request.getParameter(“videoObsId”);
Obs complexObs=Context.getObsService().getComplexObs(videoObsId,openmrsconts.RAW_视图);
ComplexData ComplexData=complexObs.getComplexData();
object2=complexData.getData();//0){
输出.写入(缓冲区,0,长度);
}
}最后{
//轻轻地关闭溪流。
关闭(输出);
关闭(输入);
}
}
//在上面添加错误处理并删除此try/catch
捕获(例外e){
log.error(“无法获取文件”,e);
}
}
私有静态无效关闭(可关闭资源){
if(资源!=null){
试一试{
resource.close();
}捕获(IOE异常){
//把你的事情做个例外。打印、记录或邮寄。
e、 printStackTrace();
}
}
}
我使用了BalusC,但在我的例子中,我没有file对象作为inputstream,只有byte数组对象


帮助..

您发现的servlet确实不适合用于流式传输视频文件。它更像是一个用于静态文件(如PDF、XLS等)的简单文件下载servlet

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


然而,这是servlet中的许多附加代码,需要对HTTP
范围
规范有很好的理解。您找到的servlet文件的作者提供了一个现成的示例。在您的特定情况下,可能建议首先将文件保存到基于本地磁盘文件系统的缓存中(例如,通过
file\createTempFile()
和HTTP会话中的一些键),这样,您就不必一次又一次地从外部服务获取它。

您是否检查了
videoObjectData
的值,以查看初始化后的值?是的,
videoObjectData
包含初始化的数据@BalusC,它现在使用最新的文件下载servlet和JavaTemp文件方法工作,而不是传递字节数组对象。解决方案:
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();
        }
    }
}