您现在的位置是:首页 > 技术教程 正文

vue中支持txt,docx,xlsx,mp4格式文件预览(纯前端)

admin 阅读: 2024-03-27
后台-插件-广告管理-内容页头部广告(手机)

前言

在平常的工作当中,已经会遇到文件上传后需要预览的功能,比如docx,doc,xls,xlsx,ppt,pdf,txt,图片,视频等格式的文件,其实也可以让后端人员写接口解析,本着不想麻烦别人的心态,能自己解决的绝不麻烦别人,这里简单介绍txt,docx,xlsx,mp4文件预览。

一、txt文本预览

       1.在vue项目中安装axios     npm i axios -S  或 yarn add axios 

        2. 准备一个txt文件,里面随便输入些内容

        

      

       3. 使用axios来请求该txt文件

        

        页面完整代码如下

        

  1. <template>
  2. <div class="txt" style="white-space: pre-wrap;">{{ textContent }}div>
  3. template>
  4. <script setup lang="ts">
  5. import { ref } from 'vue';
  6. import axios from 'axios';
  7. const textContent = ref("");
  8. //这里可以是http地址,也可以是本地地址
  9. const url = "http://10.3.1.171:7878/123.txt";
  10. axios.get(url,{
  11. responseType:"text",
  12. }).then(res=>{
  13. textContent.value = res.data;
  14. })
  15. script>

 结果如下

  

发现他可以成功的拿到文本内容,但是我们文本里不仅有数字,英文,还有中文

4.这个时候我们往txt里写入一些中文

再来看下结果

喔嚯,这个时候出现了乱码,为什么会出现乱码呢???

原因很简单,axios用的默认编码为UTF-8,而txt的默认编码为ANSI,也就是GBK,明白了错误的原因就好办了,解决方法有两种

1.直接修改txt的编码为UTF-8,修改方式参考:怎么修改txt文件默认的编码格式?_百度知道

   修改完成后结果如下

   

   发现结果是我们想要的,你以为到这里就一切都结束了么?NO,NO,NO,这种方式不推荐,我们不可能每个文件都去设计编码,我们追求的就是要完美,永不加班...硬着头皮继续往下干,怀着一颗匠心精神的我必须打磨好自己的艺术品,哈哈,于是就有了第二种解决方案

2.在axios上做返回值的编码转换

   看了axios的文档发现一个transformResponse字段配置

    

我们就可以使用这个配置项来对返回的数据做转码,在处理之前先将

responseType设置为blob,我们改用流的方式来实现,下面是完整代码

  1. <template>
  2. <div><div class="txt" style="white-space: pre-wrap;">{{ textContent }}div>div>
  3. template>
  4. <script setup lang="ts">
  5. import { ref } from 'vue';
  6. import axios from 'axios';
  7. const textContent = ref("");
  8. const url = "http://10.3.1.171:7878/123.txt";
  9. const transformData = (data:any)=>{
  10. return new Promise((resolve)=>{
  11. let reader = new FileReader();
  12. reader.readAsText(data,'GBK');
  13. reader.onload = ()=>{
  14. resolve(reader.result)
  15. }
  16. })
  17. }
  18. axios.get(url,{
  19. responseType:"blob",
  20. transformResponse: [
  21. async function (data) {
  22. return await transformData(data);
  23. },
  24. ],
  25. }).then(res=>{
  26. res.data.then((data:any)=>{
  27. textContent.value = data;
  28. })
  29. })
  30. script>

  这里使用的promise来返回fileReader读取到的数据,在fileReader中设置编码为GBK,这样编码  就同txt保持一致了,接下来

   我们再来重新创建一个txt文件

  

然后再来测试一下,结果如下

结果就是我们最终想要的了,到此txt的预览就完成了,这里只是演示了如何加载txt文本,可以将其做成一个组件,便于以后使用

二、docx文件预览

docx文件的预览我们借用第三方插件@vue-office/docx 来处理 ,这里我们直接做成一个组件,子组件提供一个url即可,代码如下

  先使用yarn或npm安装@vue-office/docx 

  1. <template>
  2. <teleport to="body">
  3. <div class="sx-docx-wrapper change-y-translate">
  4. <vue-office-docx :src="url" style="height: 100%; margin: 0; padding: 0" @rendered="rendered"/>
  5. <span class="icon-close" @click="emits('close')">span>
  6. div>
  7. teleport>
  8. template>
  9. <script lang="ts" setup>
  10. //引入VueOfficeDocx组件
  11. import VueOfficeDocx from "@vue-office/docx";
  12. //引入相关样式
  13. import "@vue-office/docx/lib/index.css";
  14. const props = defineProps({
  15. url:{
  16. type:String,
  17. default:""
  18. }
  19. })
  20. const emits = defineEmits<{
  21. (e:"close"):void
  22. }>()
  23. const rendered = ()=>{
  24. console.log("渲染完成");
  25. }
  26. script>
  27. <style lang="scss" scoped>
  28. .sx-docx-wrapper{
  29. position:fixed;
  30. width:100%;
  31. height:100%;
  32. background:rgba(0,0,0,0.6);
  33. overflow:hidden;
  34. top:0;
  35. left:0;
  36. z-index:9999;
  37. display:flex;
  38. justify-content:center;
  39. align-items:center;
  40. .icon-close{
  41. position:absolute;
  42. top:10px;
  43. right:20px;
  44. width:30px;
  45. height:30px;
  46. background:url("/img/close.png") center no-repeat;
  47. background-size:100%;
  48. cursor:pointer;
  49. }
  50. }
  51. style>

实现效果如下

三、xlsx文件预览

       实现的方法跟docx差不多,只是插件不一样

       1、 npm i @vue-office/excel  或  yarn  add @vue-office/excel

       2、代码封装如下

        

  1. <template>
  2. <teleport to="body">
  3. <div class="sx-excel-wrapper change-y-translate">
  4. <vue-office-excel
  5. :src="url"
  6. @rendered="renderedHandler"
  7. @error="errorHandler"
  8. style="width:80%;"
  9. />
  10. <span class="icon-close" @click="emits('close')">span>
  11. div>
  12. teleport>
  13. template>
  14. <script lang="ts" setup>
  15. //引入VueOfficeExcel组件
  16. import VueOfficeExcel from "@vue-office/excel";
  17. //引入相关样式
  18. import "@vue-office/excel/lib/index.css";
  19. const props = defineProps({
  20. url:{
  21. type:String,
  22. default:""
  23. }
  24. })
  25. const emits = defineEmits<{
  26. (e:"close"):void
  27. }>()
  28. const renderedHandler = ()=>{
  29. console.log("渲染完成");
  30. }
  31. const errorHandler = ()=>{
  32. console.log("渲染失败");
  33. }
  34. script>
  35. <style lang="scss" scoped>
  36. .sx-excel-wrapper{
  37. position:fixed;
  38. width:100%;
  39. height:100%;
  40. background:rgba(0,0,0,0.6);
  41. overflow:hidden;
  42. top:0;
  43. left:0;
  44. z-index:9999;
  45. display:flex;
  46. justify-content:center;
  47. align-items:center;
  48. .icon-close{
  49. position:absolute;
  50. top:10px;
  51. right:20px;
  52. width:30px;
  53. height:30px;
  54. background:url("/img/close.png") center no-repeat;
  55. background-size:100%;
  56. cursor:pointer;
  57. }
  58. }
  59. style>

  运行效果如下

四、mp4文件预览

mp4预览我们借用西瓜视频插件来实现

1、安装xgplayer  yarn add xgplayer  或者 npm i xgplayer

2.封装代码如下

  1. <template>
  2. <teleport to="body">
  3. <div class="sx-xgplayer-wrapper change-y-translate">
  4. <div class="video-section">
  5. <div id="video">div>
  6. <span class="icon-close" @click="emits('close')">span>
  7. div>
  8. div>
  9. teleport>
  10. template>
  11. <script lang="ts" setup>
  12. import Player, { Events } from 'xgplayer'
  13. import 'xgplayer/dist/index.min.css';
  14. import { onMounted,onUnmounted } from 'vue';
  15. let player:any = null;
  16. const props = defineProps({
  17. url:{
  18. type:String,
  19. default:""
  20. }
  21. })
  22. const emits = defineEmits<{
  23. (e:"close"):void
  24. }>()
  25. onMounted(()=>{
  26. player = new Player({
  27. id: 'video',
  28. url: props.url,
  29. height: '100%',
  30. width: '100%',
  31. lang:'zh-cn'
  32. })
  33. })
  34. onUnmounted(()=>{
  35. player.destroy() // 销毁播放器
  36. player = null // 将实例引用置空
  37. })
  38. script>
  39. <style lang="scss" scoped>
  40. .sx-xgplayer-wrapper{
  41. position:fixed;
  42. width:100%;
  43. height:100%;
  44. background:rgba(0,0,0,0.6);
  45. overflow:hidden;
  46. top:0;
  47. left:0;
  48. z-index:9999;
  49. display:flex;
  50. justify-content:center;
  51. align-items:center;
  52. .video-section{
  53. width:1200px;
  54. height:660px;
  55. background:#000;
  56. padding:20px;
  57. position:relative;
  58. box-shadow: 0 1px 8px 1px #5c5c5c;
  59. }
  60. .icon-close{
  61. position:absolute;
  62. top:10px;
  63. right:10px;
  64. width:20px;
  65. height:20px;
  66. background:url("/img/close.png") center no-repeat;
  67. background-size:100%;
  68. cursor:pointer;
  69. }
  70. }
  71. style>

 相关的配置项请自行参考西瓜开发文档,文档地址在代码中哟!!!

 来看看实现的效果吧


 

到这里,关于docx,xlsx,txt,mp4等预览的功能实现完成啦,下班!!!

感悟: 你不歇斯底里筋疲力尽,怎能破茧成蝶涅盘重生

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索
排行榜