Spring Boot 视频流和音频流(预加载效果)接口

正常编写的文件上传和下载,利用 HttpServletResponse 对象的 OutputStream 流,去输出文件内容的接口是无法完成网页上的视频播放、音频播放的预加载效果,这个预加载效果是我自己创的一个词吧,实际的问题是:当你在播放视频或音频的时候,你点击进度条,无法实现指定位置进行播放,莫名的不爽,这是因为后台接口写的有问题!

实际效果:

实现代码:基于 Spring Boot 的实现代码

首先编写一个:NonStaticResourceHttpRequestHandler 对象

import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.resource.ResourceHttpRequestHandler;

import javax.servlet.http.HttpServletRequest;
import java.nio.file.Path;

/**
 * @author Mr.S
 * @date 2020/3/10
 */
@Component
public class NonStaticResourceHttpRequestHandler extends ResourceHttpRequestHandler {
    public final static String ATTR_FILE = "NON-STATIC-FILE";

    @Override
    protected Resource getResource(HttpServletRequest request) {
        final Path filePath = (Path) request.getAttribute(ATTR_FILE);
        return new FileSystemResource(filePath);
    }
}

然后在需要调用的地方写这样子的接口代码:

import org.apache.commons.lang3.StringUtils;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

@RestController
public class PlayerController {
	@Autowired
    private NonStaticResourceHttpRequestHandler nonStaticResourceHttpRequestHandler;
	@GetMapping("/getPlayResource/{resourceId}")
    public void getPlayResource(@PathVariable("resourceId") Long resourceId,
                                HttpServletRequest request,
                                HttpServletResponse response) throws Exception {
        Resource resource = resourceService.getResource(resourceId);
        if (resource != null) {
            Path path = Paths.get(filePath + resource.getPath());
            if (Files.exists(path)) {
                String mimeType = Files.probeContentType(path);
                if (!StringUtils.isEmpty(mimeType)) {
                    response.setContentType(mimeType);
                }
                request.setAttribute(NonStaticResourceHttpRequestHandler.ATTR_FILE, path);
                nonStaticResourceHttpRequestHandler.handleRequest(request, response);
            } else {
                response.setStatus(HttpServletResponse.SC_NOT_FOUND);
                response.setCharacterEncoding(StandardCharsets.UTF_8.toString());
            }
        }
    }
}

就上面的接口说一些哦!

Resource 对象是我自己定义的资源对象,不是之前编写的 NonStaticResourceHttpRequestHandle r里的 Resource 对象

filePath 是我指定服务器存放文件的根路径,也是自定义的,请不要随便复制!复制完记得要进行修改!

发布了100 篇原创文章 · 获赞 30 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/assiduous_me/article/details/104806530