vue如何预览后端传来的二进制图片

目录
  • vue预览后端传来的二进制图片
    • 1.新建一个对话框
    • 2.下载方法
    • 3.转码方法
  • vue实现文件预览功能的前端
    • 预览文件的前端
      • 第一种方法:
      • 第二种方法:

vue预览后端传来的二进制图片

1.新建一个对话框

用来显示图片

<el-dialog title="" :visible.sync="imgdialog"  width="70%">
  <img :src="src" alt=""/>
</el-dialog>

2.下载方法

可以将request替换成axios

download(row) {
      this.$request({
        url: baseUrl + '/file/download',
        method: 'post',
        data: row,
        responseType: 'arraybuffer'  //这个响应类型必须要写
      }).then(res => {
        // console.log(res)  //二进制文件打印出来是乱码
         this.src = 'data:image/jpeg;base64,' + this.arrayBufferToBase64(res)
         this.imgdialog = true
      }).catch(err => {
        console.log(err)
      })
    },

3.转码方法

    arrayBufferToBase64(buffer) {
      var binary = ''
      var bytes = new Uint8Array(buffer)
      var len = bytes.byteLength
      for (var i = 0; i < len; i++) {
        binary += String.fromCharCode(bytes[i])
      }
      return window.btoa(binary)
    }

vue实现文件预览功能的前端

预览文件的前端

省略点击按钮点击触发showdialogview()方法的代码

第一种方法:

先在template中加入一个input框,绑定一个字符串类型的变量

写showdialogview()方法

调用后台的方法,如果返回的不是null(后台返回的数据是一行一行返回的),就使用for循环,添加到变量中去。

<template>
  <div class="content">
    <!--文件预览-->
    <el-dialog title="数据预览" :visible.sync="dialogvisibleview" >
      <el-input type="textarea" :rows="10" placeholder="" v-model="dataview">
      </el-input>
    </el-dialog>
  </div>
</template>
<script>
  import api from '../../api/api'
  import $ from 'jquery';
  import axios from 'axios';
  export default {
    name: "DataFile",
    inject: ['reload'],
    data(){
      return {
        dialogvisibleview: false, // 文件预览
        dataview: ''
      }
    },
    methods:{
      //预览文件
      showdialogview(id) {
        this.dataview ='';
        var dataView = new FormData;
       // var num=20;
        dataView.append("id",id);
        api.getDataDetail(dataView).then((response) => response.json())
          .then((data) => {
            if(data!=null){
              this.dialogvisibleview = !this.dialogvisibleview;
              //alert(data.data[0]);
              for (var i=0;i<=data.data.length-1;i++){
                this.dataview+=data.data[i]+"\n";
              }
            }
          });
      }
    },
    created: function () {
      console.log('cteated 钩子执行...');
    }
  }
</script>

第二种方法:

可以在对话框中加入一个table标签,在tbody标签中使用v-html绑定变量,这样,在字符串中的标签可以展示出来

因为后台给的接口返回的数据是数组中的一个下标对应的一行数据,把每一行的数据拆分成字符串数组,然后放在单元格中,这样展示出来比较整齐,还可以添加样式。

<template>
  <div class="content">
    <!--预览的模态框-->
    <el-dialog title="文件内容预览" :visible.sync="previewVisible" modal-append-to-body="false" append-to-body="true" style="height: 100%;"width="80%">
      <p style="color:red">若可视化,请选择数值列</p>
      <div id="modalContent" style="height: 600px;overflow:scroll;overflow-x:auto;overflow-y:auto ">
        <table id="box-table" style="border-collapse:collapse;height:60px;">
          <tbody id="table_body" v-html="datafileView"></tbody></table>
      </div>
    </el-dialog>
  </div>
</template>
<script>
  import api from '../../api/api'
  import $ from 'jquery';
  import axios from 'axios';
  export default {
    name: "DataFile",
    inject: ['reload'],
    data(){
      return {
         previewVisible:false,  // 预览模态框的
         datafileView:'', // 预览的表格
      }
    },
    methods:{
      // 打开预览的模态框
      openPreview (id){
        this.previewVisible = true;
        this.viewData(id);
      },
      // 在后台查询预览
      viewData (fid) {
        this.datafileView="";
        var dataView = new FormData;
        dataView.append("id",fid);
        api.getDataDetail(dataView).then((response) => response.json())
          .then((data) => {
            var viewDataString="<tr>";
            var dataArray = ((String)(data.data[0])).split(",");
            for(var i =0;i<dataArray.length;i++){
              viewDataString=viewDataString+"<td style='text-align:center;width:10%'><input type='radio' name='tableheader' value='"+i+"' @click='f1()' /></td>";
            }
            viewDataString = viewDataString+"</tr><tr style='border-color:#1eb8f7;border-bottom-style:solid;border-width:1px'>";
            for(var i =0;i<dataArray.length;i++){
              viewDataString = viewDataString+"<th style='text-align:center;width:10%'>"+dataArray[i]+"</th>";
            }
            viewDataString = viewDataString+"</tr>";
            console.log(data.data.length);
            for(var x=1;x<data.data.length;x++){
              var dataArray = ((String)(data.data[x])).split(",");
              viewDataString = viewDataString+"<tr>";
              for(var i =0;i<dataArray.length;i++){
                viewDataString = viewDataString+"<td style='text-align:center;width:15%'>"+dataArray[i]+"</td>";
              }
              viewDataString = viewDataString+"</tr>";
            }
            this.datafileView =viewDataString;
            console.log(this.datafileView );
          });
      }
    },
    created: function () {
      console.log('cteated 钩子执行...');
    }
  }
</script>

缺点:使用v-html,即使标签在浏览器中展示出来,但是里面的方法不可以使用,里面的方法失效。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • vue下载二进制流图片操作

    1.应项目要求,后台返回二进制流,而且乱码 2.红色为必须 this.$axios.post('/fishweb/agent/downLoad',this.stringify({filename:'qrCode.jpg'}), { responseType: 'arraybuffer' //指定返回数据的格式为blob }).then((res) => { var src='data:image/jpg;base64,'+ btoa(new Uint8Array(res).reduce((dat

  • Vue拿到二进制流图片如何转为正常图片并显示

    目录 二进制流图片转为正常图片并显示 解析blob 二进制流图片的展示 二进制流图片转为正常图片并显示 第一步 axios({         method: 'get',         url,         responseType: 'arraybuffer' // 最为关键       })         .then(function (response) {           that.src = 'data:image/jpeg;base64,' + that.arrayBu

  • vue实现图片路径转二进制文件流(binary)

    目录 图片路径转二进制文件流(binary) 图片路径转换为Base64 Base64转换为二进制文件流(binary) 下载二进制流文件 Blob.ajax(axios) 图片路径转二进制文件流(binary) vue项目中,需要将本地的图片或前端生成的图片传回后端,传回给后端需要将图片路径转换为二进制文件流,也就是参数中显示的(binary),这时就需要进行图片路径的转换. 图片路径转换为Base64 imageUrlToBase64(imageUrl) {   let image = ne

  • 关于vue二进制转图片显示问题 后端返回的是byte[]数组

    目录 二进制转图片显示 后端返回的是byte[]数组 1.二进制转图片显示问题 2.byte[]数组可显示 关于返回二进制图片的处理 二进制转图片显示 后端返回的是byte[]数组 1.二进制转图片显示问题 代码 lookPreview(this.previewID).then(response => { this.previewUrl = "data:image/jpeg;base64," + response.data; this.previewList.push(this.

  • vue如何预览后端传来的二进制图片

    目录 vue预览后端传来的二进制图片 1.新建一个对话框 2.下载方法 3.转码方法 vue实现文件预览功能的前端 预览文件的前端 第一种方法: 第二种方法: vue预览后端传来的二进制图片 1.新建一个对话框 用来显示图片 <el-dialog title="" :visible.sync="imgdialog"  width="70%">   <img :src="src" alt=""

  • vue裁切预览组件功能的实现步骤

    vue版本裁切工具,包含预览功能 最终效果: qiuyaofan.github.io/vue-crop-de- 源码地址: github.com/qiuyaofan/v- 第一步:先用vue-cli安装脚手架(不会安装的看 vue-cli官网) // 初始化vue-cli vue init webpack my-plugin 第二步:创建文件 新建src/views/validSlideDemo.vue, src/components里新建VueCrop/index.js,VueCrop.vue

  • vue在线预览word、excel、pdf、txt、图片的方法实例

    目录 excel文件预览 word文件预览 pdf文件预览 一.查看word 引用mammoth.js 二.查看Excel 引用sheetjs 写的项目 1.页面 2.数据 补充:vue移动端实现word在线预览 总结 excel文件预览 word文件预览 pdf文件预览 一.查看word 引用mammoth.js 安装 npm install --save mammoth 引入import mammoth from “mammoth”; 1.页面 <div id="wordView&qu

  • 上传图片预览JS脚本 Input file图片预览的实现示例

    在深圳做项目的时候,需要一个用户上传头像预览的功能!是在网上找了好多,都不太满意.要么是flash的,要么是Ajax上传后返回图片路径的,要么压根就是不能用的.幸运的是在这个项目以前有人写过一个图片预览的功能,还被我给翻了出来,在这里做个记录,方便自己以后用,也方便其他需要的朋友! 代码很简单,如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/

  • vue实现在线预览office文件的示例代码

    最近在做电子档案,后端提供了文件的华为云的oss链接.已经实现了点击下载文件的功能.但是呢,他们又希望常规的文件,可以直接点击预览,不需要下载. 按道理说,做文件的在线预览,买个第三方服务什么的,后端部署一下服务,前端对接一下,就通通搞定. 顶不住第三方基本上是要money的.那不想掏money,还有什么解决方法呢. 方法一 用微软的office online进行在线预览 https://view.officeapps.live.com/op/view.aspx?src=文件地址 例:https

  • Vue实现在线预览pdf文件功能(利用pdf.js/iframe/embed)

    前言 最近在做一个精品课程,需要在线预览课件ppt,我们的思路是将ppt转换为pdf在线预览,所以问题就是如何实现在线预览pdf了. 在实现的过程中,为了更好地显示效果,我采用了多种不同的方法,最终选择效果最好的pdf.js. 实现方法: 1:iframe 采取iframe将pdf嵌入网页从而达到预览效果,想法很美好,实现很简单,但显示很残酷- 虽然一行代码简洁明了,打开谷歌浏览器效果也还行,但缺点也是十分明显的!!!! <iframe src="http......" widt

  • Vue+UpLoad实现上传预览和删除图片的实践

    1.用vue+Element完成一个图片上传.点图预览.加删除功能,如图: 2.首先我们再组件中引入这一段代码,每个属性的使用也都放在这里了: <el-upload class="upload-demo" action=""//引号里面填要上传的图片地址,用接口的话是公共的接口地址拼接一个图片的接口 :on-preview="handlePreview"//图片已经上传完成时点击触发(钩子函数) :on-remove="handl

  • NGINX 权限控制文件预览和下载的实现原理

    目录 一.实现原理 二.实现步骤 1. NGINX配置 2. JAVA SPRINGBOOT 后台权限验证 2.1 权限校验文件下载 2.2 权限校验文件预览 三.扩展功能 1. 下载统计.访问日志 2. 下载限速 3. 防盗链 4. X-SENDFILE @date: 2020-07-31 06:00 基于 Nginx + Java(SpringBoot) 实现带权限验证的静态文件服务器,支持文件下载.PDF预览和图片预览. 需要注意的是,无需权限判断的图片不建议使用此方法,大量的图片访问会增

  • Angular2仿照微信UI实现9张图片上传和预览的示例代码

    本来在看vue.js没多久,最近在赶一个项目用回了angular2,还是先把ng2搞定吧,毕竟还不怎么懂.这两天我做的是用户表单数据的提交,大部分很简单,双向绑定就完事了,主要还是沟通的问题哈哈哈哈,虽然沟通的时候有点暴躁想甩锅,不过出了门还是高高兴兴吃饭高高兴兴回去. 好了切入问题.这几天做得最久的是仿照微信UI做的图片上传/显示缩略图/预览/删除功能,要求图片1--9张.下面来记录下如何实现微信的图片预览/删除功能. 样式--weui.css 样式用的是微信官方ui,weui.min.css

  • JavaScript代码实现txt文件的上传预览功能

    今天做项目刚好碰到这个记录一下.因为是简单的txt文件,只涉及文本,如果需要涉及图片预览就需要使用papaparse和jschardet,此处不多叙述. 表单按钮使用js的onchange="uploadfile()" 事件,function函数代码如下所示: //此处为txt文件上传预览的js代码 function uploadfile(){ var file=$("#txt")[0].files[0]; //判断上传文件是不是txt格式,判断后缀是不是.txt

随机推荐