使用HTML5中的Blob对象实现媒体播放功能

快来打我* 2021-06-26 16:06 1482阅读 1赞

前言

图片、音频、视频等资源文件,我在之前的项目中都是采用,直接放到webContent路径下,然后在页面直接访问。这样就会存在一个安全性问题,就是无论什么用户或者游客,只要知道文件的URL就可以通过在浏览器地址栏输入URL直接获取到。
最近在浏览网站的时候,无意间接触到了Blob对象,经过研究终于可以实现从服务器其他路径(不在webContent路径下)获取文件,并进行显示或播放的功能了。其原理是,首先通过ajax请求,获取blob对象,在这个过程中就可以进行访问限制(例如,访问时检测用户是否登录等)。然后通过js获取blob对象的路径,然后赋给标签。

后台代码

后台代码和下载文件的代码是一样的,示例如下:

  1. /* * 在这里可以进行权限验证等操作 */
  2. //创建文件对象
  3. File f = new File("E:\\test.mp4");
  4. //获取文件名称
  5. String fileName = f.getName();
  6. //导出文件
  7. String agent = getRequest().getHeader("User-Agent").toUpperCase();
  8. InputStream fis = null;
  9. OutputStream os = null;
  10. try {
  11. fis = new BufferedInputStream(new FileInputStream(f.getPath()));
  12. byte[] buffer;
  13. buffer = new byte[fis.available()];
  14. fis.read(buffer);
  15. getResponse().reset();
  16. //由于火狐和其他浏览器显示名称的方式不相同,需要进行不同的编码处理
  17. if(agent.indexOf("FIREFOX") != -1){ //火狐浏览器
  18. getResponse().addHeader("Content-Disposition", "attachment;filename="+ new String(fileName.getBytes("GB2312"),"ISO-8859-1"));
  19. }else{ //其他浏览器
  20. getResponse().addHeader("Content-Disposition", "attachment;filename="+ URLEncoder.encode(fileName, "UTF-8"));
  21. }
  22. //设置response编码
  23. getResponse().setCharacterEncoding("UTF-8");
  24. getResponse().addHeader("Content-Length", "" + f.length());
  25. //设置输出文件类型
  26. getResponse().setContentType("video/mpeg4");
  27. //获取response输出流
  28. os = getResponse().getOutputStream();
  29. // 输出文件
  30. os.write(buffer);
  31. }catch(Exception e){
  32. System.out.println(e.getMessage());
  33. } finally{
  34. //关闭流
  35. try {
  36. if(fis != null){
  37. fis.close();
  38. }
  39. } catch (IOException e) {
  40. System.out.println(e.getMessage());
  41. } finally{
  42. try {
  43. if(os != null){
  44. os.flush();
  45. }
  46. } catch (IOException e) {
  47. System.out.println(e.getMessage());
  48. } finally{
  49. try {
  50. if(os != null){
  51. os.close();
  52. }
  53. } catch (IOException e) {
  54. System.out.println(e.getMessage());
  55. }
  56. }
  57. }
  58. }

前端代码

Javascript代码:

  1. //创建XMLHttpRequest对象
  2. var xhr = new XMLHttpRequest();
  3. //配置请求方式、请求地址以及是否同步
  4. xhr.open('POST', './play', true);
  5. //设置请求结果类型为blob
  6. xhr.responseType = 'blob';
  7. //请求成功回调函数
  8. xhr.onload = function(e) {
  9. if (this.status == 200) { //请求成功
  10. //获取blob对象
  11. var blob = this.response;
  12. //获取blob对象地址,并把值赋给容器
  13. $("#sound").attr("src", URL.createObjectURL(blob));
  14. }
  15. };
  16. xhr.send();

HTML代码:

  1. <video id="sound" width="200" controls="controls"></video>

发表评论

表情:
评论列表 (有 0 条评论,1482人围观)

还没有评论,来说两句吧...

相关阅读

    相关 HTML5FormData对象使用

    FormData对象是HTML5的一个对象,目前的已经可以兼容一些主流的浏览器。当然了,如果你的项目还需要兼容IE8之类的低版本浏览器,这个好用的方法注定与你无缘啦。(不过你可