npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

vue-drop-upload

v0.1.7

Published

A Vue.js upload component

Downloads

27

Readme

vue-drop-upload

基于vue的批量上传组件,支持上传文件、文件夹。支持拖拽上传

安装

npm install vue-drop-upload

功能介绍

  • 按钮点击上传文件、文件夹;
  • 拖拽上传文件、文件夹;
  • 多文件上传;
  • 支持大文件分片;
  • 支持自动上传;
  • 自定义请求头;
  • 自定义请求参数;
  • 自定义过滤上传文件名;
  • 支持配置一次上传最大数量(仅限最外层文件、文件夹);
  • 支持单文件最大上传限制(单位:KB);
  • 可定义不能上传文件夹、只支持文件夹等...
  • 可定义最外层只支持上传文件夹;
  • 详细的错误提示机制;

示例

vue-drop-upload示例

vue-drop-upload示例

使用

init

import Vue from 'vue'
import uploader from 'vue-drop-upload'
import App from './App.vue'

Vue.use(uploader)

new Vue({
  render(createElement) {
    return createElement(App)
  }
}).$mount('#app')

App.vue

<template>
  <upload
    :multiple="uploadOptions.multiple"
    :action="uploadOptions.action"
    :drag="uploadOptions.drag"
    :upload-folder="uploadOptions.uploadFolder"
    :params="uploadOptions.params"
    :onerror="uploadOptions.error"
    ref="upload"
    >
    <i slot="icon">上传图标</i>
    <button type="button" name="file-button" class="upload-default" slot="file">上传文件</button>
    <button type="button" name="folder-button" class="upload-default" slot="folder">上传文件夹</button>
    <button type="button" name="button" class="upload-default" slot="submit">上传至服务器</button>
    <div class="tip-default" slot="tip">
      支持上传文件、文件夹
    </div>
  </upload>
</template>
<script>
  export default {
    data () {
      uploadOptions: {
        multiple: true,
        action: '',
        drag: true,
        uploadFolder: true,
        params: {},
        onerror: this.onerror
      }
    },
    methods: {
      onerror (err) {

      }
    }
  }
</script>

slots

   所有slot都有默认值,都可不传

slot="icon" 拖拽监听框中的图标slot

slot="file" 选择文件按钮slot,有默认class:upload-default

slot="folder" 选择文件夹按钮slot,有默认class:upload-default

slot="submit" 上传按钮slot,有默认class:upload-default

slot="tip" 补充文字说明,有默认class:tip-default

props

| prop | type | description | default | | :-: | :-: | :-: | :-: | | action | String | 必选参数,上传的地址 | —— | | headers | Object | 自定义请求头 | —— | | params | Object | 自定义请求参数 | —— | | multiple | Boolean | 是否支持多文件上传(只对上传文件的按钮有效) | false | | drag | Boolean | 是否支持拖拽上传 | false | | onlyDrag | Boolean | 是否只支持拖拽上传 | false | | isShowUploadList | Boolean | 是否显示上传列表 | true | | accept | String | 支持的文件上传格式(只对上传文件的按钮有效) | —— | | uploadFolder | Boolean | 是否支持上传文件夹 | false | | limitRootCount | Number | 最外层文件、文件夹支持的一次性上传个数 | 100 | | allowRootRepeate | Boolean | 是否允许最外层文件、文件夹名称重复上传 | true | | rootOnlyNeedFolder | Boolean | 最外层是否只支持上传文件夹 | false | | maxSize | Number | 单文件上传大小限制(单位:B) | —— | | isPerPiece | Boolean | 是否对大文件进行分片 | false | | pieceLimit | Number | 分片大小限制(单位:KB) | 5242880 | | fileNameFilters | Array | 需要过滤的文件名集合 | —— | | autoUpload | Boolean | 是否选择后自动提交 | false | | uploadingAllowUpload | Boolean | 正在上传中时是否支持选择、拖拽上传 | true | | allowChangeRootName | Boolean | 是否支持更改最外层文件、文件夹名称 | true | | onlyNeedUploadOneRoot | Boolean | 是否只允许上传一个最外层文件、文件夹(二次选择会覆盖前次选择的文件、文件夹) | false | | allowDeleteRoot | Boolean | 是否允许删除文件、文件夹(上传列表是否显示删除按钮) | true | | showFileSize | Boolean | 是否显示已经上传的文件大小/总文件大小 | true | | withCredentials | Boolean | 跨域时是否发送cookie | false | | onerror | Function | 错误信息回调 | —— | | uploadStart | Function | 开始上传回调 | —— | | uploadEnd | Function | 上传结束回调 | —— | | fileSelected | Function | 点击选择文件按钮,选择后的回调,参数为选择的文件 | —— | | folderSelected | Function | 点击选择夹文件按钮,选择后的回调,参数为选择的文件夹中的文件列表 | —— | | droped | Function | 拖拽后文件、文件夹解析完毕后的回调,参数为解析后的拖拽问价、文件夹(形式为目录树对象) | —— | | deleteRoot | Function | 删除一个根文件、文件夹的回调,参数:删除文件的index, 删除的文件解析对象,next回调(需要在执行完毕业务程序后调用该回调,执行删除,若不调用next则不执行删除文件、文件夹) | null | | uploadOneFile | Function | 上传完成一个文件的回调,参数:{ file, response }; file(上传文件的相关信息),response(后端返回的参数信息) | —— | | changeRootName | Function | 更改最外层文件、文件夹名称回调 | —— |

实例方法

调用方式:this.$refs.upload.submit()

| 名称 | 用途 | 注意事项 | | :-: | :-: | :-: | | submit | 提交所选择的文件、文件夹 | —— | | abort | 取消上传,终止正在发送的请求 | —— | | clear | 清空上传列表 | 正在上传中不会操作,并发送一个code:9 的error | | setOriginalData | 设置上传列表数据 | 传入参数必须为Array,一项列表数据表示一个最外层文件、文件夹 |

关于setOriginalData方法的参数举例:

[
  {
    name: '文件夹1', // 文件夹名称
    type: 'folder', // 文件夹类型(默认)
  },
  {
    name: '文件1', // 文件夹名称
    type: 'file', // 文件类型
  }
]

获取全部的上传数据

调用方式:this.$refs.upload.originalData
| 该数据包含上传列表中的所有数据,树状对象描述的目录树结构。

errorMap (重要)

项目中所有的异常操作都会调用error回调,参数:
{
  code: 0, // 根据code确定错误类型
  message: '', // 错误提示文案
  data: {} // error对象,主要用于httpError
}

| code | type | description | | :-: | :-: | :-: | | 1 | typeError | 反应不支持上传文件夹 | | 2 | httpError | ajax请求onerror捕获的错误 | | 3 | responseErrorCode | 请求成功,但后端返回status不是100 | | 4 | limitRootCountError | 外层文件、文件夹超过限制的数量 | | 5 | rootOnlyFolderError | 外层只支持上传文件夹,却上传了文件 | | 6 | maxSizeError | 但文件大于最大限制 | | 7 | emptyUpload | 上传文件为空 | | 8 | emptyFolderSelect | 选择了空文件夹 | | 9 | uploadingNotClear | 正在上传中执行了clear | | 10 | uploadingNotAllowUpload | 正在上传中不允许选择、拖拽文件 | | 11 | rootNameRepeat | 最外层文件、文件夹名称重复 | | 12 | callbackError | 调用回调函数过程中捕捉到的错误 |

外附说明

分片实现,当上传第一个分片时,后端需要回传uploadId参数,作为后续分片的uploadId参数的值,以此来区分多个分片是属于同一文件。

由于我自己公司项目,返回状态码200时,同时需要response.status === 100才为请求成功,因此在代码中有依赖于这一个条件,思考良久没有想到方法可以将这个拆分出去。如有建议可以信息我~~~有需要用到此项目的小伙伴,可自行copy稍作更改即可。