需求:实际文件在其他应用服务器,需要使用api获取文件字节流,定义一个rest接口返回字节流,Android和chrome都可以正常预览,但IOS-WebView和Safari无法播放,原因如下
- safari不支持整个文件流,服务器必须支持分段请求。
- safari对于文件流的请求需要包含一个请求头Range, 和一个响应头Content-Range,通过Nginx代理后没有返回Range的相关信息。(HTTP断点续传(分块传输)(HTTP头格式非常清楚) - findumars - 博客园)
- 分段播放返回支持 httpStatus 206(SC_PARTIAL_CONTENT)
故新增一个IOS侧预览Rest接口,整体代码如下:
1、声明解析video的ResourceHttpRequestHandler(因为是远程字节流,所以利用临时文件构造FileSystemResource)
@Component
public class VideoResourceHttpRequestHandler extends ResourceHttpRequestHandler implements InitializingBean {
public final static String ATTR_FILE = "IOS-VIDEO-FILE";
private final static File TEMP_PATH = new File("/tmp/video");
@Autowired
private OaServiceAdapter oaServiceAdapter;
@Override
public void afterPropertiesSet() throws Exception {
//初始化清理 视频文件
FileUtils.deleteDirectory(TEMP_PATH);
//创建文件夹
if(!TEMP_PATH.exists()){
TEMP_PATH.mkdirs();
}
}
@Override
protected Resource getResource(HttpServletRequest request) throws IOException {
//todo 重复文件去某 固定 路径下查找
String fileId = (String) request.getAttribute(ATTR_FILE);
if(fileId != null){
byte[] bytes = oaServiceAdapter.getOaFileStream(fileId);
File tempFile = new File(TEMP_PATH,fileId + ".mp4");
FileUtils.writeByteArrayToFile(tempFile,bytes);
//注册删除钩子
tempFile.deleteOnExit();
return new FileSystemResource(tempFile);
}
return null;
}
byte[] toPrimitives(Byte[] oBytes)
{
byte[] bytes = new byte[oBytes.leng

最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



