element ui

clipboard.png
使用element ui 表单内上传
第一次上传成功、 第二次上传失败
必刷新页面才能上传成功

<template>
  <el-dialog
    title='语料上传'
    width="480px"
    @close="closeDialog" 
    :close-on-click-modal="false"
    :visible.sync="showCorpusUpload">
    <el-form
      :rules='rules'
      ref="corpusUpload"
      :model="corpusUpload"
      label-width="120px">
      <el-form-item label="上传批次:" required prop="loadPath">
        <el-input v-model="corpusUpload.loadPath" class="elinput" placeholder="请输入上传批次"></el-input>
      </el-form-item>
      <el-tooltip placement="bottom">
        <div slot="content" class="bottomtTip">若语音文件没有头信息,则系统按照用户选择的无头语音格式处理;若语音文件有头信息,本项可忽略。</div>
          <el-form-item label="无头语音格式:" prop="dataType">
            <el-select v-model="corpusUpload.dataType" :clearable="true" placeholder="请选择语音格式" class="elinput">
              <el-option
                v-for="item in audioTypeList" 
                :key="item.dataCode" 
                :label="item.describer" 
                :value="item.dataCode">
              </el-option>
            </el-select>
          </el-form-item>
        </el-tooltip>
      <el-form-item label="所属信道:"  required prop="channelName">
          <el-select v-model="corpusUpload.channelName" :clearable="true" placeholder="请选择所属信道" class="elinput">
            <el-option
              v-for="item in channelList" 
              :key="item.dataCode" 
              :label="item.describer" 
              :value="item.dataCode">
            </el-option>
          </el-select>
      </el-form-item>
      <el-form-item label="上传方式:" required prop="uploadProtocol">
        <el-radio  v-model="corpusUpload.uploadProtocol" label="LOCAL">本地上传</el-radio>
        <el-radio  v-model="corpusUpload.uploadProtocol" label="true">远程导入</el-radio>
      </el-form-item>
      <el-form-item v-if="corpusUpload.uploadProtocol==='true'" label="文件路径:" required prop="filePath">
        <el-input v-model="corpusUpload.filePath" class="elinput"></el-input>
      </el-form-item>
      <el-upload
        ref="upload"
        :action="baseURL"
        accept=".wav,.mp3,wma,ogg,ape,aac"
        :before-upload="beforeUpload"
        :on-success="uploadSuccess"
        :on-change="handleChange"
        multiple
        :file-list="fileListAdd">
        <el-button class="Btn" v-if="corpusUpload.uploadProtocol==='LOCAL'"><span class="uploadBtn">上传本地语音</span></el-button>
      </el-upload>
      <el-form-item label="用户名:" required prop="userName" v-if="corpusUpload.uploadProtocol==='true'">
        <el-input
          placeholder="请输入用户名"
          v-model.trim="corpusUpload.userName"
          class="elinput"
          ></el-input>
      </el-form-item>
      <el-form-item label="密码: " required prop="password" v-if="corpusUpload.uploadProtocol==='true'"  class="elinputpass">
        <el-input
          placeholder="请输入密码"
          type="password"
          v-model="corpusUpload.password"
          class="elinput"
          ></el-input>
      </el-form-item>
      <div class="inputContainer">
      <el-form-item label="语料描述:" prop="describer">
          <el-input
            class="elinput"
            resize="none"
            type="textarea"
            :rows="4"
            :maxlength="200"
            v-model="corpusUpload.describer">
          </el-input>
          <span>{{corpusUpload.describer.length + '/200字'}}</span>
     </el-form-item>
     </div>
      <div class="bottom">
        <el-button  type="success" @click="save()">保存</el-button>
        <el-button  @click="close()">关闭</el-button>
      </div>
    </el-form>
  </el-dialog>
</template>

<script>
import checkRules from '../../utils/check'
import { mapState } from "vuex";
export default {
props: [

'isShow',
'userLogin'

],
data () {

return {
  baseURL:"https://base/dw-dm-digit_local/api/files/upload",
  fileListAdd: [], // 上传文件列表
  audioTypeList: [], // 无音文件格式列表
  channelList: [], // 所属信道列表
  uploadForm: new FormData(),   // 一个formdata
  showCorpusUpload: this.isShow, // 弹出框是否显示
  // 上传条件
  corpusUpload: {
    // loadPath: '/'+ this.userLogin+'/'+''+'/',
    loadPath: '', // 上传批次
    appId: 'datawood', // 来源信息
    user: this.userLogin, // 上传人员
    dataType: '', // 数据格式
    channelName: '', // 所属信道
    uploadProtocol: 'LOCAL', // 上传方式
    filesNum: '',
    filesSize: '',
    describer: '', // 描述
    // userName: '', // 用户名
    // password: '', // 密码
  },
  rules: {
    loadPath: [ // 上传批次校验
      { validator: checkRules.checkUploadNum, required: true }
    ],
    filePath: [ // 文件路径校验
      { validator: checkRules.checkfilePath, required: true }
    ],
    channelName: [ // 所属信道
      { required: true, message: '请选择所属信道' }
    ],
    dataType: [ // 上传方式
      { message: '请选择语音文件格式' }
    ],
    userName: [ // 用户名
      {validator: checkRules.checkUserName},
      {type: 'string', required: true, message: '用户名必填'}
    ],
    password: [ // 密码
      {validator: checkRules.checkPassword},
      {type: 'string', required: true, message: '密码必填'}
    ]
  }
}

},
methods: {

...mapState(["user"]),
// 文件状态改变时的钩子,添加文件、上传成功和上传失败时都会被调用
handleChange(file, fileList) {
  this.fileListAdd.push(file)
},
// 保存按钮
save() {
  this.$refs['corpusUpload'].validate((valid) => {
    if (valid) {
      this.uploadForm.append('loadPath', '/'+ this.userLogin+'/'+this.corpusUpload.loadPath+'/')
      this.uploadForm.append('appId', this.corpusUpload.appId)
      this.uploadForm.append('user', this.corpusUpload.user)
      this.uploadForm.append('dataType', this.corpusUpload.dataType)
      this.uploadForm.append('channelName', this.corpusUpload.channelName)
      this.uploadForm.append('uploadProtocol', this.corpusUpload.uploadProtocol)
      this.uploadForm.append('filesNum', this.corpusUpload.filesNum)
      this.uploadForm.append('filesSize', this.corpusUpload.filesSize)
      this.uploadForm.append('describer', this.corpusUpload.describer)
      this.$api.corpus.upLoadVoice(this.uploadForm).then(res => {
        this.$message('上传成功!')
        this.$emit('inquire')
        vm.$refs.upload.fileListAdd.length = 0;
      })
      this.showCorpusUpload = false
      this.$refs['corpusUpload'].resetFields() // 重置字段
    }
  })
},
uploadSuccess () {
  //  this.$message('上传成功!')
},
// 关闭按钮
close () {
  this.$refs['corpusUpload'].resetFields() // 重置字段
  this.$emit('on-show-change')
  this.fileListAdd = [] // 清空上传列表
},
// 关闭对话框
closeDialog () {
  this.$refs['corpusUpload'].resetFields() // 重置字段
  this.fileListAdd = [] // 清空上传列表
},
// 上传文件之前
beforeUpload (file) {
  const extension = file.name.split('.')[1] === 'mp3'
  const extension1 = file.name.split('.')[1] === 'wav'
  const extension2 = file.name.split('.')[1] === 'wma'
  const extension3 = file.name.split('.')[1] === 'ogg'
  const extension4 = file.name.split('.')[1] === 'ape'
  const extension5 = file.name.split('.')[1] === 'aac'
  const isLt500M = file.size / 1024 / 1024 < 500
  if (!extension && !extension1 && !extension2 && !extension3 && !extension4 && !extension5) {
    this.$message.error( '文件上传的格式不正确')
  }  else if (!isLt500M) {
    this.$message.error('上传文件大小不能超过500MB!')
  }
  this.uploadForm.append('files',file)
  return false
}

},
watch: {

isShow (val) {  // 父组件传入值
  this.showCorpusUpload = val
  // 字典表数据
  this.$api.corpus.dictionary().then(res => {
    this.audioTypeList = res.filter(item => item.typeCode === 'noHeadAudio')
    this.channelList = res.filter(item => item.typeCode === 'channel')
  })
},
showCorpusUpload (val) {  // 当前组件show值传入父组件
  this.$emit('on-show-change', val)
},
corpusUploadShow (val) {  // 接口请求中改变的show值
  this.showCorpusUpload = val
}

}
}
</script>

阅读 1.1k
推荐问题