文件上传

ajax文件上传

单文件上传

默认只需填写action便可以上传文件

如若需要处理成功或者失败那么请绑定@success和@error事件

<c-upload
  action="https://jsonplaceholder.typicode.com/posts/"
  @success="onSuccess"
  @error="onError"
/>
<script>
  export default {
    methods: {
      onSuccess (res, rawFile) {
        this.$notify({
          title: '上传成功!',
          message: '上传成功后的回调函数',
          type: 'success'
        })
      },
      onError (err, rawFile) {
        this.$notify({
          title: '上传失败!',
          message: '上传失败后的回调函数',
          type: 'error'
        })
      }
    }
  }
</script>

多文件上传

添加multiple属性就可以上传多文件

<c-upload
  action="https://jsonplaceholder.typicode.com/posts/"
  @success="onSuccess"
  @error="onError"
  multiple
/>
<script>
  export default {
    methods: {
      onSuccess (res, rawFile) {
        console.log('')
        this.$notify({
          title: '上传成功!',
          message: '上传成功后的回调函数',
          type: 'success'
        })
      },
      onError (err, rawFile) {
        this.$notify({
          title: '上传失败!',
          message: '上传失败后的回调函数',
          type: 'error'
        })
      }
    }
  }
</script>

限制最大上传文件数量

当指定了multiple属性后可以指定每次可同时上传的最大文件数量limit

<c-upload
  action="https://jsonplaceholder.typicode.com/posts/"
  @success="onSuccess"
  @error="onError"
  multiple
  :limit="3"
  @exceed="onExceed"
/>
<script>
  export default {
    methods: {
      onSuccess (res, rawFile) {
        console.log('')
        this.$notify({
          title: '上传成功!',
          message: '上传成功后的回调函数',
          type: 'success'
        })
      },
      onError (err, rawFile) {
        this.$notify({
          title: '上传失败!',
          message: '上传失败后的回调函数',
          type: 'error'
        })
      },
      onExceed (files, fileList) {
        console.log('onExceed')
        this.$notify({
          title: '上传失败!',
          message: `超过限制`,
          type: 'error'
        })
      },
    }
  }
</script>

修改上传按钮主题

可以自行修改按钮主题,修改按钮主题请参考button组件

<div class="has-margin-sm">
  <c-upload
    action="https://jsonplaceholder.typicode.com/posts/"
    @success="onSuccess"
    @error="onError"
  />
</div>
<div class="has-margin-sm">
  <c-upload
    primary
    round
    action="https://jsonplaceholder.typicode.com/posts/"
    @success="onSuccess"
    @error="onError"
  />
</div>
<div class="has-margin-sm">
  <c-upload
    success
    outline
    action="https://jsonplaceholder.typicode.com/posts/"
    @success="onSuccess"
    @error="onError"
  />
</div>
<div class="has-margin-sm">
  <c-upload
    warning
    outline round
    action="https://jsonplaceholder.typicode.com/posts/"
    @success="onSuccess"
    @error="onError"
  />
</div>
<div class="has-margin-sm">
  <c-upload
    danger
    flat
    action="https://jsonplaceholder.typicode.com/posts/"
    @success="onSuccess"
    @error="onError"
  />
</div>
<script>
  export default {
    methods: {
      onSuccess (res, rawFile) {
        console.log('')
        this.$notify({
          title: '上传成功!',
          message: '上传成功后的回调函数',
          type: 'success'
        })
      },
      onError (err, rawFile) {
        this.$notify({
          title: '上传失败!',
          message: '上传失败后的回调函数',
          type: 'error'
        })
      },
      onExceed (files, fileList) {
        console.log('onExceed')
        this.$notify({
          title: '上传失败!',
          message: `超过限制`,
          type: 'error'
        })
      },
    }
  }
</script>

自定义上传按钮

可以使用slot="btn"来自定义上传按钮

<c-upload
  action="https://jsonplaceholder.typicode.com/posts/"
  @success="onSuccess"
  @error="onError"
  multiple
  :limit="3"
  @exceed="onExceed"
>
  <c-button slot="btn" primary outline>自定义的上传按钮</c-button>
</c-upload>
<script>
  export default {
    methods: {
      onSuccess (res, rawFile) {
        console.log('')
        this.$notify({
          title: '上传成功!',
          message: '上传成功后的回调函数',
          type: 'success'
        })
      },
      onError (err, rawFile) {
        this.$notify({
          title: '上传失败!',
          message: '上传失败后的回调函数',
          type: 'error'
        })
      },
      onExceed (files, fileList) {
        console.log('onExceed')
        this.$notify({
          title: '上传失败!',
          message: `超过限制`,
          type: 'error'
        })
      },
    }
  }
</script>

上传文件大小的限制

上传文件之前会执行validator函数进行一些校验,参数会拿到对应的文件对象,可以在这里进行上传文件大小的限制,若函数返回 false,则代表校验失败,组件会停止该次上传操作

<c-upload
  action="https://jsonplaceholder.typicode.com/posts/"
  @success="onSuccess"
  @error="onError"
  :validator="validator"
/>
<script>
  export default {
    methods: {
      onSuccess (res, rawFile) {
        console.log('')
        this.$notify({
          title: '上传成功!',
          message: '上传成功后的回调函数',
          type: 'success'
        })
      },
      onError (err, rawFile) {
        this.$notify({
          title: '上传失败!',
          message: '上传失败后的回调函数',
          type: 'error'
        })
      },
      validator (file) {
        const MB = file.size/1000/1000
        if (MB > 40) {
          this.$notify({
            title: '上传失败!',
            message: '文件超过40MB!',
            type: 'error'
          })
          return false;
        }
        return true;
      }
    }
  }
</script>

手动上传

当auto-upload=false时需要手动调用组件的submit方法来进行文件的上传

<c-upload
  ref="upload"
  action="https://jsonplaceholder.typicode.com/posts/"
  @success="onSuccess"
  @error="onError"
  :auto-upload="false"
/>
<c-button primary @click="submitUpload">点击上传</c-button>
<script>
  export default {
    methods: {
      onSuccess (res, rawFile) {
        console.log('')
        this.$notify({
          title: '上传成功!',
          message: '上传成功后的回调函数',
          type: 'success'
        })
      },
      onError (err, rawFile) {
        this.$notify({
          title: '上传失败!',
          message: '上传失败后的回调函数',
          type: 'error'
        })
      },
      submitUpload() {
        this.$refs.upload.submit();
      },
    }
  }
</script>

上传时附带的额外参数

可以在data属性指定上传时附带的额外参数,比如token

<c-upload
  action="https://jsonplaceholder.typicode.com/posts/"
  @success="onSuccess"
  @error="onError"
  :data="{token:'d6q8wy82'}"
/>
<script>
  export default {
    methods: {
      onSuccess (res, rawFile) {
        console.log('')
        this.$notify({
          title: '上传成功!',
          message: '上传成功后的回调函数',
          type: 'success'
        })
      },
      onError (err, rawFile) {
        this.$notify({
          title: '上传失败!',
          message: '上传失败后的回调函数',
          type: 'error'
        })
      }
    }
  }
</script>

展示上传文件列表 slot="file-list"

<c-upload
  action="https://jsonplaceholder.typicode.com/posts/"
  @success="onSuccess"
  @error="onError"
>
  <span slot="file-list" slot-scope="props">
    <span> {{props.filenames[0]}}</span>
  </span>
</c-upload>
<script>
  export default {
    methods: {
      onSuccess (res, rawFile) {
        console.log('')
        this.$notify({
          title: '上传成功!',
          message: '上传成功后的回调函数',
          type: 'success'
        })
      },
      onError (err, rawFile) {
        this.$notify({
          title: '上传失败!',
          message: '上传失败后的回调函数',
          type: 'error'
        })
      }
    }
  }
</script>

限制上传文件的格式需要指定accept属性

<c-upload
  action="https://jsonplaceholder.typicode.com/posts/"
  @success="onSuccess"
  @error="onError"
  accept="text/javascript, application/javascript"
/>
<script>
  export default {
    methods: {
      onSuccess (res, rawFile) {
        console.log('')
        this.$notify({
          title: '上传成功!',
          message: '上传成功后的回调函数',
          type: 'success'
        })
      },
      onError (err, rawFile) {
        this.$notify({
          title: '上传失败!',
          message: '上传失败后的回调函数',
          type: 'error'
        })
      }
    }
  }
</script>

自定义上传方法

如果组件自身的上传不符合业务场景需求,那么也可以自定义http-request方法,返回一个Promise,用来覆盖默认的上传行为

<c-upload
  @success="onSuccess"
  @error="onError"
  :http-request="httpRequest"
/>
<script>
  export default {
    methods: {
      onSuccess (res, rawFile) {
        this.$notify({
          title: '上传成功!',
          message: '上传成功后的回调函数',
          type: 'success'
        })
      },
      onError (err, rawFile) {
        this.$notify({
          title: '上传失败!',
          message: '上传失败后的回调函数',
          type: 'error'
        })
      },
      httpRequest (opt) {
        return new Promise((resolve, reject) => {
          setTimeout(() => {
            resolve('完成')
          },1000)
        })
      }
    }
  }
</script>

属性

名称 类型 默认值 说明
action String - 必选参数,上传的地址
accept String - 限制上传的文件类型
limit Number - 最大上传文件数量
multiple Boolean false 是否可以选中多个文件
auto-upload Boolean true 是否在选取文件后立即进行上传
name String 'file' 文件字段名称
headers Object { } 自定义请求头
data Object { } 上传时附带的额外参数
validator Function - 上传文件之前会执行validator函数进行一些校验,参数会拿到对应的文件对象,若函数返回 false,则代表校验失败,组件会停止该次上传操作 参数为(file: Object)
httpRequest Function - 覆盖默认的上传行为,可以自定义上传的实现

事件

名称 类型 默认值 说明
exceed Function - 超过最大上传文件限制事件 参数为(files: Array, fileList: Array)
progress Function - 上传过程事件 参数为(e: Object, file: Object)
success Function - 上传成功事件 参数为(res: Object, file: Object)
error Function - 上传失败后事件 参数为(err: Object, file: Object)

slots

名称 是否 Scoped 说明
file-list 自定义上传文件列表的展示,props.filenames为上传列表的文件名数组
btn 自定义上传按钮