vue中使用element的upload插件获取本地txt/sql文件中的内容

需求

需求:支持 .txt 和 .sql 后缀文件内容的读取(包括解决之后出现中文乱码的问题)。

直接上代码

html部分

           // 上传组件
            <el-upload
              ref="upload-sql"
              action=''
              accept=".txt,.sql"
              :auto-upload="false"
              :on-change="changeFile"
              :http-request="uploadHandler">
                <el-button class="mr-2" plain slot="trigger" size="small">
                  <i class="el-icon-upload mr-1 font-size-14"></i>读取文件
              </el-button>支持 .txt 和 .sql 文件读取
            </el-upload>
// 展示用的富文本框
      	<el-input
          type="textarea"
          :rows="40"
          placeholder="SQL输入"
          v-model="textarea">
        </el-input> 

js部分

//判断文件是否是GB2312编码
import {isGb} from './isGb/isGb.js'

export default {
  name: "sqlImport",
  data () {
    return { 
        textarea: ''
    }
  },
  methods: {
        
      changeFile (file, fileList) {
        if (file.status === 'ready') {
          // 已上传文件列表如果存在 2 条记录,移除第一条,实现替换效果
          if (fileList.length === 2) {
            fileList.shift()
          }
         
          // 手动开始上传
          this.$refs['upload-sql'].submit()
        }
      },
      uploadHandler (params) {

         return new Promise(async (resolve, reject) => {
          const isLt12M = params.file.size / 1024 / 1024 < 2;
          if (!isLt12M) {
            this.$notify({
              message: "文件超过2MB大小,请按照要求整理上传",
              type: 2
            });
            return reject(false);
          }
          try {
            await isGb(params.file);
          } catch (e) {
            params.onProgress({ percent: this.getRandomNum(19, 99) })
            setTimeout(() => {
              this.readText(params,'UTF-8')
            }, 100)
            return reject(false);
          }
          params.onProgress({ percent: this.getRandomNum(19, 99) })
          setTimeout(() => {
            this.readText(params,'GB2312')
          }, 100)
        });
      },
      
      async readText (params,format) {
        // UTF-8,GBK,GB2312
        const readFile = new FileReader()
        readFile.readAsText(params.file, format)
        readFile.onload = (e) => {
          this.textarea = e.target.result;
          console.log(this.textarea);
          
          params.onProgress({ percent: 100 }) // 调用 element ui 进度条
          params.onSuccess() // 调用 element ui 上传成功方法
        }
      },
  }  
}

isGb.js

   // 判断文本编码格式
export async function isGb (file) {
    return await new Promise((resolve, reject) => {
      const reader = new FileReader();
      reader.readAsText(file,'GB2312');
      console.log(file)
  
      reader.onloadend = (e) => {
        const str = e.target.result;
        // 大致取一半
        const sampleStr = str.slice(4, 4 + str.length / 2);
        if (sampleStr.indexOf("�") === -1) {
          resolve(true);
        } else {
          reject(new Error(""));
        }
      };
  
      reader.onerror = () => {
        reject(new Error("文件内容读取失败,请检查文件是否损坏"));
      };
    });
  };

主要代码如上,按需自取。
之后可能会实现让文本框实现SQL代码高亮效果

本文大部分内容来自互联网

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用Element UI的el-upload组件实现文件上传功能,示例代码如下: ``` <template> <el-upload class="upload-demo" action="/upload" :on-success="handleSuccess" :before-upload="beforeUpload" :file-list="fileList" :headers="headers" :data="uploadData" :multiple="true" :limit="5" :accept="'image/*'" :on-exceed="handleExceed" :auto-upload="false" :list-type="'picture-card'" :show-file-list="false" :drag="true" :with-credentials="true" :disabled="false" :on-remove="handleRemove" :on-progress="handleProgress"> <i class="el-icon-plus"></i> <div class="upload-text">将文件拖到此处,或点击上传</div> <div slot="tip" class="upload-tip">只能上传jpg/png文件,且不超过5个文件</div> </el-upload> </template> <script> import { Upload } from 'element-ui'; export default { components: { 'el-upload': Upload }, data() { return { fileList: [], headers: {}, uploadData: {}, }; }, methods: { handleSuccess(response, file, fileList) { // 上传成功回调 console.log(response); console.log(file); console.log(fileList); }, handleExceed(files, fileList) { // 超出文件个数限制触发 this.$message.warning(`当前限制选择 ${this.limit} 个文件,您已选择 ${fileList.length} 个文件`); }, beforeUpload(file) { // 上传前回调 console.log(file); }, handleRemove(file, fileList) { // 删除单个文件回调 console.log(file); console.log(fileList); }, handleProgress(event, file, fileList) { // 上传进度回调 console.log(event); console.log(file); console.log(fileList); }, }, }; </script> ``` 以上示例代码,我们使用VueElement UI库,通过el-upload组件和其各种属性和方法完成了文件上传功能的实现。注意,示例代码的上传接口地址和上传需要的参数等都需要根据具体情况进行修改。具体使用方法可参考Element UI官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值