zoukankan      html  css  js  c++  java
  • 前端文件下载(html5+vue/excel下载)

    excel等文件的上传和下载

    一、下载

    1.data数据

    data () {
        return {
          list:[{name: 'cs1', id: '5'}, {name: 'cs1', id: '24'}],
          selectModule: '', // 选择某列表中一个
          selectModuleName: '', // 下载的名称
          selectModuleUrl: '' // 下载的地址
        }
    }

    2.Dom操作

    <div>
      <span>下载模版:</span>
      <el-select v-model="selectModule" @change="handleSelectModule" placeholder="请选择下载模板" style="margin-left: 20px;  300px; height: 36px;">
        <el-option v-for="item in list" :key="item.id" :value="item.id" :label="item.name" />
      </el-select>
      <a :href="selectModuleUrl" :download="selectModuleName">下载</a>
    </div>

    3.下载

    handleSelectModule (val) {
      // 获取模版下载地址
      const params = {
        fileId: val,
        type: 1
      }
      downLoadExcel(params, '下载地址').then(res => {
        var reader = new FileReader()
        reader.readAsText(res.data, 'gbk')
        const _this = this
        reader.onload = function (e) {
          try {
            var result = JSON.parse(reader.result)
            console.log(result)
            _this.$message({
              type: 'error',
              message: '下载模版不存在'
            })
          } catch (err) {
            const url = window.URL.createObjectURL(res.data)
            let proName = ''
            for (let i = 0; i < _this.list.length; i++) {
              if (_this.list[i].proID === val) {
                proName = _this.list[i].proName
                break
              }
            }
            _this.selectModuleUrl = url
            _this.selectModuleName = `${proName}下载模版名称.xls`
          }
        }
      }).catch(error => {
        console.log(error)
      })
    },
    
    // 下载方法
    import axios from 'axios'
    
    function downLoadExcel (params, url) {
      console.log(params, url)
      return axios({
        baseURL: `${API_ROOT}`, // 下载的基本地址, url是拼接下载地址(后缀), 如 http://www.baidu.com/downUrl
        withCredentials: true,
        crossDomain: true,
        url: url,
        method: 'post',
        responseType: 'blob',
        params: params
      })
    }

    二、上传

    1.data数据data () {    return {

          size: null, // 文件大小
          fileInfo: {
            name: '',
            file: undefined
          },
          id: ''
          dialogVisible: false,
        }
    }

    2.操作dom

       <input ref="fileUpload" type="file" @change="fileUpload($event)" style=" 0px; height: 0px;visibility: hidden;"/>
        <span v-if="!(fileInfo.name)" @click="handleCheckFile" class="opItem">请选择上传类型</span>
        <span class="opItem">{{fileInfo.name}}</span>
        <div class="dialog-content">
         <el-select filterable v-model="selectProject" @change="handleSelectModule" placeholder="请选择上传项目" style="margin-left: 20px;  300px; height: 36px;">
          <el-option v-for="item in list" :key="item.id" :value="item.id" :label="item.name" />
        </el-select>

    3.方法实现

      handleSelectModule () {
        // 调用下载方法
        如上
      }
      handleCheckFile () {
        this.$refs.fileUpload.click()
      },
      fileUpload (e) {
        // console.log(e.target.files[0])
        // let type = e.target.files[0].name.split('.')[1]
        this.fileInfo.name = e.target.files[0].name
        this.fileInfo.file = e.target.files[0]
        this.size = e.target.files[0].size
        // this.size = bigSize / 1024;
        this.$refs.fileUpload.value = null
      },
      uploadList () {
          if (this.size > 30 * 1024 * 1024) {
            this.$message({
              type: 'error',
              message: '文件不能超过30M'
            })
            return
          }
          this.dialogVisible = false
          uploadFileAsync({ file: this.fileInfo.file, id: this.id, url: '/xxxx/uploadExcel' })
            .then(res => {
             console.log('---成功操作')
            })
            .catch(error => {
              this.fileInfo = {
                name: '',
                file: undefined
              }
              this.$message({
                type: 'error',
                message: error.responseMsg
              })
            })
        },
      function uploadFileAsync (params) {
      const { file, id, url } = params
      var formData = new FormData()
      formData.append('uploadFile', file)
      return axios({
        baseURL: `${API_ROOT}`,
        url: url,
        data: formData,
        timeout: 600000,
        method: 'post',
        headers: {
          'Content-Type': 'multipart/form-data'
        },
        withCredentials: true,
        crossDomain: true,
        params: {
          id: id
        }
      }).then(res => {
        return Promise.resolve(res.data)
      }).catch(error => {
        console.log(error)
        return Promise.reject(new Error({ responseCode: '20089', responseMsg: '请求出错了,请稍后再试' }))
      })

     

  • 相关阅读:
    【NIO】NIO之浅谈内存映射文件原理与DirectMemory
    【搜索引擎】全文索引数据结构和算法
    【多线程】并发与并行
    【缓存】缓存穿透、缓存雪崩、key重建方案
    布隆过滤器
    多层路由器通信
    【路由】设置二级路由器
    【硬件】集线器,交换机,路由器
    JZOJ100048 【NOIP2017提高A组模拟7.14】紧急撤离
    JZOJ100045 【NOIP2017提高A组模拟7.13】好数
  • 原文地址:https://www.cnblogs.com/TheYouth/p/14151642.html
Copyright © 2011-2022 走看看