如何解决从 Java 中的嵌入式码头流式传输视频无法跳到我想要的那一分钟
我有一个 java 应用程序,它使用嵌入式码头来提供 rest api。这个rest api之一允许下载给定特定id的文件。
- 用户可以通过上传休息端点上传文件,此时我保存文件并在包含文件 ID 的数据库中存储一条记录。
- 上传后,您可以通过端点 (GET)
server/api/v1/files/{fileId}
访问文件
- 在该端点中,我执行以下操作以提供文件:
String filePath = "/shared/files/fileId";
InputStream in = null;
OutputStream out = null;
try {
File file = new File(filePath);
response.setContentType(Files.probeContentType(file.toPath()));
response.setHeader("Content-Type",Files.probeContentType(file.toPath()));
response.setHeader("Content-Length",fileEntity.size + "");
in = new FileInputStream(file);
out = response.getOutputStream();
byte[] bytes = new byte[(int) fileEntity.size];
int bytesRead;
while ((bytesRead = in.read(bytes)) != -1) {
out.write(bytes,bytesRead);
}
} catch (Exception e) {
logger.error(e.getMessage());
}finally{
in.close();
out.close();
}
只要我只尝试下载文件,这就可以正常工作,并且在视频的情况下,如果我在 chrome 中访问端点,它会显示用于查看视频的默认页面并且视频流开始。
但是,当我尝试跳到第 10 分钟(例如我正在播放的视频)时,视频只会继续播放,而不会跳到我选择的时间。
另一个问题是随机,对于大文件,甚至在显示视频默认页面之前请求超时。
这就是我初始化嵌入式码头的方式:
ServletContextHandler contextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);
contextHandler.setContextPath("/");
server = new Server(new QueuedThreadPool(10000,10));
HttpConfiguration httpConfig = new HttpConfiguration();
httpConfig.setOutputBufferSize(1024);
ServerConnector connector = new ServerConnector(server,new HttpConnectionFactory(httpConfig));
connector.setPort(port);
server.addConnector(connector);
ServletHolder jerseyServlet = contextHandler.addServlet(org.glassfish.jersey.servlet.ServletContainer.class,"/api/v1/*");
jerseyServlet.setInitOrder(0);
jerseyServlet.setInitParameter("jersey.config.server.provider.packages","webapi");
FilterHolder filter = new FilterHolder(new CrossOriginFilter());
filter.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM,"*");
filter.setInitParameter(CrossOriginFilter.ALLOWED_METHODS_PARAM,"POST,GET,OPTIONS,PUT,DELETE,HEAD");
filter.setInitParameter(CrossOriginFilter.ALLOWED_HEADERS_PARAM,"*");
filter.setInitParameter(CrossOriginFilter.ALLOW_CREDENTIALS_PARAM,"true");
contextHandler.addFilter(filter,"/*",EnumSet.of(DispatcherType.REQUEST));
contextHandler.setErrorHandler(new CustomErrorHandler());
ResourceHandler resourceHandler = new ResourceHandler();
HandlerCollection handlerCollection = new HandlerCollection();
handlerCollection.addHandler(contextHandler);
handlerCollection.addHandler(resourceHandler);
server.setHandler(handlerCollection);
这就是文件端点的创建方式:
@Path("/")
public class FilesRestService {
@Context
HttpServletRequest request;
@Context
SecurityContext securityContext;
@Context
HttpServletResponse response;
@GET
@Path("/files/{fileId}")
public void download(@PathParam("fileId") String fileId) {
getFilesImpl().downloadFile(fileId);
}
@POST
@Path("/files/upload")
@Produces("application/json")
@Consumes("multipart/form-data")
public Response uploadFile() {
return getFilesImpl().uploadFile();
}
}
请随时指出我是否应该完全改变方法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。