当前位置: 首页 > article >正文

vue2实现txt文件在线预览

txt文件在线预览不需要下载另外的插件,主要有两种形式,一种是上传完成后实现预览;另一种是后端提供文件下载接口,获取文件在线地址实现预览;

一、上传完成后实现预览

<template>
  <!-- txt文件预览 -->
  <div>
    <el-dialog
      title="文件预览"
      :visible="dialogVisible"
      show-close
      append-to-body
      width="60%"
      :before-close="cancelDialog"
    >
      <input type="file" @change="handleFileChange">
      <div class="panel-box" v-html="txt"></div>
      <div slot="footer" class="dialog-footer tc">
        <button class="btn-submit btn-submit-sm" @click="cancelDialog()">关闭</button>
      </div>
    </el-dialog>
  </div>
</template>

<script>
export default {
  name:'txtFilePreview',
  data() {
    return {
      dialogVisible:false,
      txt:'',
    };
  },
  methods: {
    previewFile(){
      this.dialogVisible = true;
    },
    handleFileChange(e){
      const file = e.target.files[0];
      if (!file) {
        return;
      }
      const that = this;
      const reader = new FileReader();
      reader.onload = function(e) {
        that.txt = e.target.result.split('\n').join('<br />');
      };
      reader.onerror = function(error) {
        console.error('Error: ', error);
      };
      reader.readAsText(file);
    },
    cancelDialog(){
      this.dialogVisible = false;
    },
  }
};
</script>

<style lang="scss" scoped>
</style>

实现效果:

 二、后端提供文件下载接口实现预览

<template>
  <!-- txt文件预览 -->
  <div>
    <el-dialog
      title="文件预览"
      :visible="dialogVisible"
      show-close
      append-to-body
      width="60%"
      :before-close="cancelDialog"
    >
      <div class="panel-box" v-html="txt"></div>
      <div slot="footer" class="dialog-footer tc">
        <button class="btn-submit btn-submit-sm" @click="cancelDialog()">关闭</button>
      </div>
    </el-dialog>
  </div>
</template>

<script>
export default {
  name:'txtFilePreview',
  data() {
    return {
      dialogVisible:false,
      txt:'',
    };
  },
  methods: {
    previewFile(event,docId) {
      event.stopPropagation();
      this.dialogVisible = true;
      const inParam = {
        DOC_ID: docId,
        STAFF_ID: this.$store.getters.staffId,
        STAFF_NAME: this.$store.getters.staffName,
        SYS_USER_CODE: this.$store.getters.systemUserCode
      };
      const loading = this.$commonUtil.loading.open()
      this.$txtPreview(this.mciApi.common.file.downFile, { ...inParam }).then(r => {
        loading.close()
        // 根据文件地址解析txt文件内容
        this.$axios.get(r,{
          responseType:"blob",
          transformResponse: [
            async (data)=>{
              return await this.transformData(data);
            },
          ],
        }).then(res=>{
          res.data.then((data)=>{
            this.txt = data ? data.split('\n').join('<br />') : '';
          })
        })
      }).catch((e) => {
        loading.close()
      })
    },
    transformData(data){
      return new Promise((resolve)=>{
        let reader = new FileReader();
        reader.readAsText(data,'UTF-8');
        reader.onload = ()=>{
          resolve(reader.result)
        }
      })
    },
    cancelDialog(){
      this.dialogVisible = false;
    },
  }
};
</script>

<style lang="scss" scoped>
</style>

Tips

$txtPreview:是封装后的post请求;

this.mciApi.common.file.downFile:是后端提供的文件下载方法,返回一个文件流数据。获取数据后将文件流进行地址转换作为结果返回。

 文件流转url地址:

const blob = new Blob([content], { type: 'application/text' });
const url = window.URL.createObjectURL(blob);

实现效果:

参考文章:vue3中实现txt格式文件预览(纯前端)_vue3 txt预览-CSDN博客 


http://www.kler.cn/a/461752.html

相关文章:

  • 30分钟学会css
  • 华为 Sensor 省电策略调研
  • 「Mac畅玩鸿蒙与硬件49」UI互动应用篇26 - 数字填色游戏
  • 【C++】B2092 开关灯
  • 2025/1/4期末复习 密码学 按老师指点大纲复习
  • 以往博客的复习补充——part1
  • 通过服务器推送消息:Websocket和SSE解释
  • Kafka为什么要放弃Zookeeper
  • 医疗实时数仓环境配置与ods层
  • Conda 命令教程
  • 折叠手机突然折翅,折叠屏采购暴跌,苹果挽救或是幻想
  • 一维前缀和,二维前缀和
  • 文章解读与仿真程序复现思路——EI\CSCD\北大核心《基于模型预测控制的掺氢微能源网低碳经济调度 》
  • Java Excel转PDF POI+Itext5
  • 【无线传感网】WSN数据管理技术
  • 自学记录鸿蒙API 13:Calendar Kit日历功能从学习到实践
  • 面试题解,JVM的运行时数据区
  • 【杂谈】-快速了解协作机器人
  • 推荐5款局域网IP扫描工具,支持电脑+Android!
  • 什么是递归解析服务器?它有什么特点
  • 正则表达式中,`$1` 是一个反向引用(backreference),它代表了匹配过程中捕获的第一个子表达式(即第一个括号内的内容)
  • 速盾:服务器CDN加速解析的好处有哪些呢?
  • leetcode热题100(79. 单词搜索)dfs回溯 c++
  • JWT包中的源码分析【Golang】
  • 解决uniapp H5页面限制输入框只能输数字问题
  • protobuf: 通讯录2.1