gpt4 book ai didi

java - 使用 Java servlet 进行视频下载/流式传输

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:09:58 26 4
gpt4 key购买 nike

当客户端访问类似于这样的 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 tutorial但在我的例子中,我没有文件对象作为输入流,只有字节数组对象。

帮助..

最佳答案

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

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

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

关于java - 使用 Java servlet 进行视频下载/流式传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18577307/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com