当客户端访问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连接来提高缓冲速度,每个请求都请求视频文件的不同部分。
Range
但是,这是servlet中的许多其他代码,需要对HTTP Range规范有充分的了解。由您发现的文件Servlet的同一作者以扩展文件servlet的形式提供了一个立即可用的示例。在您的特定情况下,建议您首先将文件保存到基于本地磁盘文件系统的缓存中(例如,通过File#createTempFile()HTTP会话中的某个键),这样就无需一次又一次从外部服务获取文件。
File#createTempFile()