【前端开发】js上传文件组件封装

当前页使用,element ui组件为例

1、html

 <el-upload
        class="upload-template"
        :class="{ 'no-files': !fileList.length }"
        action="#"
        :accept="accept"
        :file-list="fileList"
        :http-request="uploadSectionFile"
        :before-upload="beforeUpload"
      >
        <div slot="tip" class="el-upload__tip el-mt-2">请上传doc/docx文件</div>
        <el-button slot="trigger" type="primary">上传模板</el-button>
        <el-button class="el-ml-3" @click="clearFile">清空模板</el-button>
        <input id="editTemplate" type="file" style="display:none" />
        <template slot="file" slot-scope="scope">
          <a
            v-if="scope.file.status !== 'uploading'"
            class="el-upload-list__item-name"
            @click="handleFileClick(scope.file)"
          >
            <svg-icon icon-class="icc-files-doc" class="el-mr-2" />{{ scope.file.description }}
          </a>
          <label class="el-upload-list__item-status-label">
            <i
              :class="{
                'el-icon-upload-success': true,
                'el-icon-circle-check': true
              }"
            />
          </label>
          <i
            slot="trigger"
            class="update-icon list-item-icon el-primary"
            title="更新模板"
            @click="handleEditFile(scope.file)"
          >
            <svg-icon icon-class="ic-upload" />
          </i>
          <el-tooltip class="item-btn" content="删除模板" placement="top">
            <i class="el-icon-delete list-item-icon btn-delete" @click="handleRemoveFile(scope.file)" />
          </el-tooltip>
          <el-progress
            v-if="scope.file.status === 'uploading'"
            type="line"
            :stroke-width="2"
            :percentage="parsePercentage(scope.file.percentage)"
          />
        </template>
      </el-upload>

2、js

限制上传文件类型

 private accept: string = '.doc,.docx'

上传事件触发

  // 上传模板
  async uploadSectionFile(content: any) {
    let type = content.file.type
    content.file.description = content.file.name
    let description = content.file.name
    let params = {
      reportId: this.reportId,
      description: description
    }
    let file = new FormData()
    file.append('file', content.file)try {
      let res = await addReportTemplate(params, file, content)
      this.getReportTemplate()
      this.$message.success('新增模板成功')
    }
  }

3、上传接口注意

// 新增报表模板
export function addReportTemplate(params: { reportId: string; description: string }, file: any, content: any) {
  return request({
    method: 'post',
    url: 'admin/reportTemplate',
    params: params,
    onUploadProgress: progressEvent => {
      let percent = ((progressEvent.loaded / progressEvent.total) * 100) | 0
      // 调用onProgress方法来显示进度条,需要传递个对象 percent为进度值
      content.onProgress({ percent: percent })
    },
    data: file,
    baseURL: buseBaseUrl
  })
}
原文地址:https://www.cnblogs.com/xiaohuizhang/p/14421878.html