我有一项服务可以执行以下操作:
1)从用户获取参数(http get)
2)将视频文件作为回复
返回给用户3)我的代码是:
@GET
@Path("/test")
public Response test(@QueryParam("url") final String videoUrl) {
final CrawlerResult result = this.crawlerService.crawl(videoUrl);
if (result.isSuccess()) {
final StreamingOutput fileStream = this.crawlerService.videoAsStream(result.getResult());
return Response.ok(fileStream, MediaType.APPLICATION_OCTET_STREAM)
.header("content-disposition", "attachment; filename = movie.mp4")
.build();
} else {
return Response.status(Response.Status.NOT_ACCEPTABLE)
.entity(result)
.build();
}
}
CrawlerService
:
@Override
public StreamingOutput videoAsStream(final String videoUrl) {
try {
final URL url = new URL(videoUrl);
return output -> {
output.write(IOUtils.toByteArray(url));
output.flush();
};
} catch (final MalformedURLException e) {
log.error("Url exception for url {}",videoUrl);
throw new UncheckedIOException(e);
}
}
如您所见,我会抓取一个网址,制作URL
个对象,然后使用StreamingOutput
IOUTILS
这适用于短视频,但是当视频太长时,用户会等待约5分钟的响应。
有没有可能的方法来重写我的逻辑?
答案 0 :(得分:1)
最后,我找到了解决方案 我替换
output.write(IOUtils.toByteArray(url));
output.flush();
到
return output -> {
IOUtils.copy(url.openConnection().getInputStream(),output);
output.flush();
output.close();
};