Vue页面中展示图片文档音频视频的三种方式

Posted 村西那条弯弯的河流

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vue页面中展示图片文档音频视频的三种方式相关的知识,希望对你有一定的参考价值。

    vue页面中展示图片、文档、音频、视频,主要是src中赋值为base64或者url地址。所以,如何组装url,就是解决问题的关键。工作中常用的有三种方式:

    1、全路径方式:

               对于安全要求不严格的,可以采用这种方式。因为这种全路径一般会长期有效,仅仅通过src=url,不太好做鉴权。

              可以通过nginx,apache,tomcat等服务器,配置出文件的url,后端返回给前端,前端放入url直接使用。也可以后端提供一个有参get请求接口,前端拼接出该接口的url,参数在url后,根据参数不同,后端接口返回不同数据。该种方式最简单,不再上代码。

  2、base64方式;

       后端返回给前端组装好的base64字符串,前端拿到后,放入src的值中,即可正常显示音频。base64字符串方式弊端是,比较大时,在app浏览器中,可能导致页面崩溃,卡死,无响应。

示例代码如下:

后端java代码:

@RequestMapping(value="getBase64Str",method = RequestMethod.GET)
public String getBase64Str(HttpServletRequest request, HttpServletResponse response) 
    String filePath = "F:/data/upload/verifyCode/leaveStation.mp3";
    BASE64Encoder encoder = new BASE64Encoder();
    String fileStr =null;
    try 
        byte[] bFile = Files.readAllBytes(new File(filePath).toPath());
         fileStr = "data:audio/mp3;base64," + encoder.encode(bFile);
     catch (IOException e) 
        e.printStackTrace();
    
    return fileStr;

前端vue代码:

      发起请求部分代码

axios(
    url:'http://localhost:8889/aa/getBase64Str',
    headers: 'Content-Type': "application/json;charset=UTF-8",
        "Authorization":"hello1"
).then(result=> 
    // console.log(result.data)
    this.srcUrl = result.data;
)

  音频标签部分代码:

<audio :src="srcUrl" controls id="audio_demo" >

data部分:

data()
    return
        srcUrl:''
    
,

3、后端返回文件流,前端自己组装url。

    后端返回流,前端获取到流,并转成成url,赋值给src,将音频文件展示出来。此种方式,是通过请求获取的流,前端自己组装url,故可以在请求中加入权限校验的参数,无需后端配置自动放行的白名单。并且前端组装的url,页面刷新后就失效,无法复制出来给其他地方用,安全性更好。代码示例如下:

java后端代码:

@RequestMapping(value="getStream",method = RequestMethod.GET)
public void getStream(HttpServletRequest request, HttpServletResponse response) 
    try 
        String downloadFile = "F:/data/upload/verifyCode/leaveStation.mp3";
        FileInputStream is = new FileInputStream(downloadFile);
        int i = is.available(); // 得到文件大小
        byte data[] = new byte[i];
        is.read(data); // 读数据
        is.close();
        response.setContentType("audio/mp3"); // 设置返回的文件类型
        OutputStream toClient = response.getOutputStream(); // 得到向客户端输出二进制数据的对象
        toClient.write(data); // 输出数据
        toClient.close();

     catch (Exception e) 
        e.printStackTrace();
    

前端vue代码:

    axios请求部分:

axios(
    url:'http://localhost:8889/official-web-back/cirrus/getStream',
    responseType:'blob',
    headers: 'Content-Type': "application/json;charset=UTF-8",
        "Authorization":"hello1"
).then(result=>
    //console.log(result.data)
    this.srcUrl = window.URL.createObjectURL(result.data);
)

    h5比钱部分:

    <audio :src="srcUrl" controls id="audio_demo" >

data部分:

data()
    return
        srcUrl:''
    
,

Vue创建组件的三种方式

1、使用 Vue.extend 来创建全局的Vue组件

<div id="app">
    <!-- 如果要使用组件,直接,把组件的名称,以 HTML 标签的形式,引入到页面中,即可 -->
    <mycom1></mycom1>
  </div>

  <script>
    // 1.1 使用 Vue.extend 来创建全局的Vue组件
    // var com1 = Vue.extend(
    //   template: ‘<h3>这是使用 Vue.extend 创建的组件</h3>‘ // 通过 template 属性,指定了组件要展示的HTML结构
    // )
    // 1.2 使用 Vue.component(‘组件的名称‘, 创建出来的组件模板对象)
    // Vue.component(‘myCom1‘, com1)
    // 如果使用 Vue.component 定义全局组件的时候,组件名称使用了 驼峰命名,则在引用组件的时候,需要把 大写的驼峰改为小写的字母,同时,两个单词之前,使用 - 链接;
    // 如果不使用驼峰,则直接拿名称来使用即可;
    // Vue.component(‘mycom1‘, com1)

    // Vue.component 第一个参数:组件的名称,将来在引用组件的时候,就是一个 标签形式 来引入 它的
    // 第二个参数: Vue.extend 创建的组件  ,其中 template 就是组件将来要展示的HTML内容
    Vue.component(mycom1, Vue.extend(
      template: <h3>这是使用 Vue.extend 创建的组件</h3>
    ))


    // 创建 Vue 实例,得到 ViewModel
    var vm = new Vue(
      el: #app,
      data: ,
      methods: 
    );
  </script>

2、直接使用 Vue.component 创建

  <div id="app">
    <!-- 还是使用 标签形式,引入自己的组件 -->
    <mycom2></mycom2>
  </div>

  <script>
    // 注意:不论是哪种方式创建出来的组件,组件的 template 属性指向的模板内容,必须有且只能有唯一的一个根元素
    Vue.component(mycom2, 
      template: <div><h3>这是直接使用 Vue.component 创建出来的组件</h3><span>123</span></div>
    )

    // 创建 Vue 实例,得到 ViewModel
    var vm = new Vue(
      el: #app,
      data: ,
      methods: 
    );
  </script>

3、 在被控制的 #app 外面,使用 template 元素,定义组件的HTML模板结构 

<div id="app">
    <mycom3></mycom3>
    <!-- <login></login> -->
  </div>


  <div id="app2">
    <mycom3></mycom3>
    <login></login>
  </div>

  <!-- 在被控制的 #app 外面,使用 template 元素,定义组件的HTML模板结构  -->
  <template id="tmpl">
    <div>
      <h1>这是通过 template 元素,在外部定义的组件结构,这个方式,有代码的只能提示和高亮</h1>
      <h4>好用,不错!</h4>
    </div>
  </template>

  <template id="tmpl2">
    <h1>这是私有的 login 组件</h1>
  </template>

  <script>
    Vue.component(mycom3, 
      template: #tmpl
    )

    // 创建 Vue 实例,得到 ViewModel
    var vm = new Vue(
      el: #app,
      data: ,
      methods: 
    );


    var vm2 = new Vue(
      el: #app2,
      data: ,
      methods: ,
      filters: ,
      directives: ,
      components:  // 定义实例内部私有组件的
        login: 
          template: #tmpl2
        
      ,
    )
  </script>

 

以上是关于Vue页面中展示图片文档音频视频的三种方式的主要内容,如果未能解决你的问题,请参考以下文章

vue中路由传参的三种基本方式

vue路由传参的三种基本方式

vue中实现 ‘换肤 / 切换样式主题’ 功能的三种方式详解(干货)

Vue创建组件的三种方式

VUE - 路由传参的三种方式

Vue路由传参的三种基本方式