Element-UI中Upload上传文件前端缓存处理示例


Posted in Javascript onFebruary 21, 2019

Element-UI对于文件上传组件的功能点着重于文件传递到后台处理,所以要求action为必填属性。

但是如果需要读取本地文件并在前端直接处理,文件就没有必要传递到后台,比如在本地打开一个JSON文件,利用JSON文件在前端进行动态展示等等。

下面就展示一下具体做法:

首先定义一个jsonContent, 我们的目标是将本地选取的文件转换为JSON赋值给jsonContent

然后我们的模板文件是利用el-dialog和el-upload两个组件组合:这里停止文件自动上传模式:auto-upload="false"

<el-button type="primary" @click="dialogVisible = true">Load from File</el-button>
 <el-dialog title="Load JSON document from file" :visible.sync="dialogVisible">
  <el-upload :file-list="uploadFiles" action="alert" :auto-upload="false" multiple :on-change="loadJsonFromFile">
   <el-button size="small" type="primary">Select a file</el-button>
   <div slot="tip">upload only jpg/png files, and less than 500kb</div>
  </el-upload>
  <span slot="footer">
   <el-button type="primary" @click="dialogVisible = false">cancel</el-button>
   <el-button type="primary" @click="loadJsonFromFileConfirmed">confirm</el-button>
  </span>
 </el-dialog>

最后通过html5的filereader对变量uploadFiles中的文件进行读取并赋值给jsonContent

if (this.uploadFiles) {
    for (let i = 0; i < this.uploadFiles.length; i++) {
     let file = this.uploadFiles[i]
     console.log(file.raw)
     if (!file) continue
     let reader = new FileReader()
     reader.onload = async (e) => {
      try {
       let document = JSON.parse(e.target.result)
       console.log(document)
      } catch (err) {
       console.log(`load JSON document from file error: ${err.message}`)
       this.showSnackbar(`Load JSON document from file error: ${err.message}`, 4000)
      }
     }
     reader.readAsText(file.raw)
    }
   }

为方便测试,以下是完整代码:

<template>
 <div>
  <el-button type="primary" @click="dialogVisible = true">Load from File</el-button>
 <el-dialog title="Load JSON document from file" :visible.sync="dialogVisible">
  <el-upload :file-list="uploadFiles" action="alert" :auto-upload="false" multiple :on-change="loadJsonFromFile">
   <el-button size="small" type="primary">Select a file</el-button>
   <div slot="tip">upload only jpg/png files, and less than 500kb</div>
  </el-upload>
  <span slot="footer">
   <el-button type="primary" @click="dialogVisible = false">cancel</el-button>
   <el-button type="primary" @click="loadJsonFromFileConfirmed">confirm</el-button>
  </span>
 </el-dialog>
</div>
 
</template>
 
<script>
export default {
 data () {
  return {
   // data for upload files
   uploadFilename: null,
   uploadFiles: [],
   dialogVisible: false
  }
 },
 methods: {
  loadJsonFromFile (file, fileList) {
   this.uploadFilename = file.name
   this.uploadFiles = fileList
  },
  loadJsonFromFileConfirmed () {
   console.log(this.uploadFiles)
   if (this.uploadFiles) {
    for (let i = 0; i < this.uploadFiles.length; i++) {
     let file = this.uploadFiles[i]
     console.log(file.raw)
     if (!file) continue
     let reader = new FileReader()
     reader.onload = async (e) => {
      try {
       let document = JSON.parse(e.target.result)
       console.log(document)
      } catch (err) {
       console.log(`load JSON document from file error: ${err.message}`)
       this.showSnackbar(`Load JSON document from file error: ${err.message}`, 4000)
      }
     }
     reader.readAsText(file.raw)
    }
   }
   this.dialogVisible = false
  }
 }
}
</script>

PS: 相关阅读

https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
将HTML自动转为JS代码
Jun 26 Javascript
addEventListener 的用法示例介绍
May 07 Javascript
jQuery EasyUI Panel面板组件使用详解
Feb 28 Javascript
JS仿Base.js实现的继承示例
Apr 07 Javascript
JavaScript运动框架 链式运动到完美运动(五)
May 18 Javascript
详解Vue 非父子组件通信方法(非Vuex)
May 24 Javascript
Vue实现购物车的全选、单选、显示商品价格代码实例
May 06 Javascript
React优化子组件render的使用
May 12 Javascript
vue中利用iscroll.js解决pc端滚动问题
Feb 15 Javascript
使用eslint和githooks统一前端风格的技巧
Jul 29 Javascript
js在HTML的三种引用方式详解
Aug 29 Javascript
详解vue之自行实现派发与广播(dispatch与broadcast)
Jan 19 Vue.js
详解Puppeteer前端自动化测试实践
Feb 21 #Javascript
javascript中join方法实例讲解
Feb 21 #Javascript
React 组件渲染和更新的实现代码示例
Feb 21 #Javascript
vue图片上传本地预览组件使用详解
Feb 20 #Javascript
Vue 后台管理类项目兼容IE9+的方法示例
Feb 20 #Javascript
浅谈小程序 setData学问多
Feb 20 #Javascript
9102年webpack4搭建vue项目的方法步骤
Feb 20 #Javascript
You might like
分享微信扫码支付开发遇到问题及解决方案-附Ecshop微信支付插件
2015/08/23 PHP
yii2实现根据时间搜索的方法
2016/05/25 PHP
PHP中Socket连接及读写数据超时问题分析
2016/07/19 PHP
PHP实现可添加水印与生成缩略图的图片处理工具类
2018/01/16 PHP
使用CSS3实现字体颜色渐变的实现
2021/03/09 HTML / CSS
(function(){})()的用法与优点
2007/03/11 Javascript
建立良好体验度的Web注册系统ajax
2007/07/09 Javascript
JavaScript 字符串与数组转换函数[不用split与join]
2009/12/13 Javascript
基于jQuery实现最基本的淡入淡出效果实例
2015/02/02 Javascript
JS实现仿雅虎首页快捷登录入口及导航模块效果
2015/09/19 Javascript
JavaScript函数柯里化详解
2016/04/29 Javascript
JQuery解析XML数据的几个简单实例
2016/05/18 Javascript
利用types增强vscode中js代码提示功能详解
2017/07/07 Javascript
javascript计算渐变颜色的实例
2017/09/22 Javascript
JS随机排序数组实现方法分析
2017/10/11 Javascript
JavaScript实现获取select下拉框中第一个值的方法
2018/02/06 Javascript
通过JS运行机制的角度说说作用域
2019/03/12 Javascript
微信小程序 flexbox layout快速实现基本布局的解决方案
2020/03/24 Javascript
关于javascript中的promise的用法和注意事项(推荐)
2021/01/15 Javascript
PyQt5实现五子棋游戏(人机对弈)
2020/03/24 Python
python使用递归的方式建立二叉树
2019/07/03 Python
django框架auth模块用法实例详解
2019/12/10 Python
Django 设置admin后台表和App(应用)为中文名的操作方法
2020/05/10 Python
python 实现弹球游戏的示例代码
2020/11/17 Python
python爬虫多次请求超时的几种重试方法(6种)
2020/12/01 Python
Django+Django-Celery+Celery的整合实战
2021/01/20 Python
里程积分管理买卖交换平台:Points.com
2017/01/13 全球购物
美国网上眼镜供应商:LEOTONY(眼镜、RX太阳镜和太阳镜)
2017/10/31 全球购物
世嘉游戏英国官方商店:SEGA Shop UK
2019/09/20 全球购物
全球最大化妆品零售网站:SkinStore
2020/10/24 全球购物
致800米运动员广播稿
2014/02/16 职场文书
大学学风建设方案
2014/05/04 职场文书
小学教师师德师风自我评价
2015/03/04 职场文书
小学教学工作总结2015
2015/05/13 职场文书
解决SpringBoot跨域的三种方式
2021/06/26 Java/Android
Python加密技术之RSA加密解密的实现
2022/04/08 Python