22 KiB
入门开始
NPM
npm install vue-upload-component --save
const VueUploadComponent = require('vue-upload-component')
Vue.component('file-upload', VueUploadComponent)
Curated
No data
直接使用
unpkg
<script src="https://unpkg.com/vue"></script>
<script src="https://unpkg.com/vue-upload-component"></script>
<script>
Vue.component('file-upload', VueUploadComponent)
</script>
jsDelivr
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vue-upload-component"></script>
<script>
Vue.component('file-upload', VueUploadComponent)
</script>
简单的例子
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue-upload-component Test</title>
<script src="https://unpkg.com/vue"></script>
<script src="https://unpkg.com/vue-upload-component"></script>
</head>
<body>
<div id="app">
<ul>
<li v-for="file in files">{{file.name}} - Error: {{file.error}}, Success: {{file.success}}</li>
</ul>
<file-upload
ref="upload"
v-model="files"
post-action="/post.method"
put-action="/put.method"
@input-file="inputFile"
@input-filter="inputFilter"
>
上传文件
</file-upload>
<button v-show="!$refs.upload || !$refs.upload.active" @click.prevent="$refs.upload.active = true" type="button">开始上传</button>
<button v-show="$refs.upload && $refs.upload.active" @click.prevent="$refs.upload.active = false" type="button">停止上传</button>
</div>
<script>
new Vue({
el: '#app',
data: function () {
return {
files: []
}
},
components: {
FileUpload: VueUploadComponent
},
methods: {
/**
* Has changed
* @param Object|undefined newFile 只读
* @param Object|undefined oldFile 只读
* @return undefined
*/
inputFile: function (newFile, oldFile) {
if (newFile && oldFile && !newFile.active && oldFile.active) {
// 获得相应数据
console.log('response', newFile.response)
if (newFile.xhr) {
// 获得响应状态码
console.log('status', newFile.xhr.status)
}
}
},
/**
* Pretreatment
* @param Object|undefined newFile 读写
* @param Object|undefined oldFile 只读
* @param Function prevent 阻止回调
* @return undefined
*/
inputFilter: function (newFile, oldFile, prevent) {
if (newFile && !oldFile) {
// 过滤不是图片后缀的文件
if (!/\.(jpeg|jpe|jpg|gif|png|webp)$/i.test(newFile.name)) {
return prevent()
}
}
// 创建 blob 字段 用于图片预览
newFile.blob = ''
let URL = window.URL || window.webkitURL
if (URL && URL.createObjectURL) {
newFile.blob = URL.createObjectURL(newFile.file)
}
}
}
});
</script>
</body>
</html>
SSR (服务器同构)
<template>
<file-upload v-model="files" post-action="/">Upload file</file-upload>
</template>
<style>
/*
import '~vue-upload-component/dist/vue-upload-component.part.css'
@import "~vue-upload-component/dist/vue-upload-component.part.css";
或
*/
.file-uploads {
overflow: hidden;
position: relative;
text-align: center;
display: inline-block;
}
.file-uploads.file-uploads-html4 input[type="file"] {
opacity: 0;
font-size: 20em;
z-index: 1;
top: 0;
left: 0;
right: 0;
bottom: 0;
position: absolute;
width: 100%;
height: 100%;
}
.file-uploads.file-uploads-html5 input[type="file"] {
overflow: hidden;
position: fixed;
width: 1px;
height: 1px;
z-index: -1;
opacity: 0;
}
</style>
<script>
import FileUpload from 'vue-upload-component/dist/vue-upload-component.part.js'
export default {
components: {
FileUpload,
},
data() {
return {
files: []
}
},
}
</script>
** 或者 **
import FileUpload from 'vue-upload-component/src'
webpack.config.js
const nodeExternals = require('webpack-node-externals');
{
//...
externals: [
nodeExternals({whitelist:[/^vue-upload-component\/src/]})
]
//...
}
选项 / 属性
input-id
input 标签的 id 属性
-
类型:
String -
默认值:
this.name -
示例:
<file-upload input-id="file2"></file-upload> <!--输出--> <input id="file2" />
name
input标签的 name 属性
-
类型:
String -
默认值:
file -
示例:
<file-upload name="file"></file-upload> <!--输出--> <input name="file" />
post-action
POST 请求的上传URL
-
类型:
String -
默认值:
undefined -
示例:
<file-upload post-action="/upload/post.php"></file-upload>
put-action
PUT 请求的上传URL
-
类型:
String -
默认值:
undefined -
浏览器:
> IE9 -
详细:
put-action不为空请优先PUT请求 -
示例:
<file-upload put-action="/upload/put.php"></file-upload>
custom-action
自定义上传方法
-
类型:
async Function -
默认值:
undefined -
详细:
custom-action优先级高于put-action, post-action -
示例:
<file-upload :custom-action="customAction"></file-upload>async function customAction(file, component) { // return await component.uploadPut(file) return await component.uploadHtml4(file) }
headers
自定义上传请求 header 数据
-
类型:
Object -
默认值:
{} -
浏览器:
> IE9 -
示例:
<file-upload :headers="{'X-Token-CSRF': 'code'}"></file-upload>
data
POST 请求: 附加请求的 body
PUT 请求: 附加请求的 query
-
类型:
Object -
默认值:
{} -
示例:
<file-upload :data="{access_token: 'access_token'}"></file-upload>
value, v-model
文件列表
-
类型:
Array<File | Object> -
默认值:
[] -
详细:
浏览
File详细信息 -
示例:
<file-upload :value="files" @input="updatetValue"></file-upload> <!--或--> <file-upload v-model="files"></file-upload>
accept
表单的accept属性, MIME type
-
类型:
String -
默认值:
undefined -
浏览器:
> IE9 -
示例:
<file-upload accept="image/png,image/gif,image/jpeg,image/webp"></file-upload> <!--或--> <file-upload accept="image/*"></file-upload>
multiple
文件表单的 multiple 属性
是否允许选择多个文件
-
类型:
Boolean -
默认值:
false -
详细:
如果是
falsefiles里面最多只有一个文件 多的会自动删除 -
示例:
<file-upload :multiple="true"></file-upload>
directory
文件表单的 directory 属性
是否是上传文件夹
-
类型:
Boolean -
默认值:
false -
示例:
<file-upload :directory="true" :multiple="true"></file-upload>
extensions
允许上传的文件后缀
-
类型:
Array | String | RegExp -
默认值:
undefined -
示例:
<file-upload extensions="jpg,gif,png,webp"></file-upload> <!--或--> <file-upload :extensions="['jpg', 'gif', 'png', 'webp']"></file-upload> <!--或--> <file-upload :extensions="/\.(gif|jpe?g|png|webp)$/i"></file-upload>
size
允许上传的最大字节
-
类型:
Number -
默认值:
0 -
浏览器:
> IE9 -
详细:
0等于不限制 -
示例:
<file-upload :size="1024 * 1024"></file-upload>
timeout
上传超时时间毫秒
-
类型:
Number -
默认值:
0 -
浏览器:
> IE9 -
示例:
<file-upload :timeout="600 * 1000"></file-upload>
maximum
列表最大文件数
-
类型:
Number -
默认值:
props.multiple ? 0 : 1 -
示例:
<file-upload :maximum="10"></file-upload>
thread
同时并发上传的文件数量 线程数
-
类型:
Number -
默认值:
1 -
浏览器:
> IE9 -
示例:
<file-upload :thread="3"></file-upload>
drop
拖拽上传
-
类型:
Boolean | Element | CSS selector -
默认值:
false -
详细:
如果设置成
true则读取父组件作为容器 -
示例:
<file-upload :drop="true"></file-upload>
drop-directory
是否开启拖拽目录
-
类型:
Boolean -
默认值:
true -
详细:
如果设置成
false则过滤掉目录 -
示例:
<file-upload :drop-directory="false"></file-upload>
add-index
-
类型:
Boolean, Number -
默认值:
undefined -
版本:
>= 2.6.1 -
详细:
add()方法index参数的默认值 -
示例:
<file-upload :add-index="true"></file-upload>
选项 / 事件
文件被改变触发的方法
默认用于v-model绑定
@input
-
参数:
files: Array<File | Object>
-
示例:
<template> <file-upload :value="files" @input="updatetValue"></file-upload> <!--或者--> <file-upload v-model="files"></file-upload> </template> <script> export default { data() { return { files: [] } }, methods: { updatetValue(value) { this.files = value } } } </script>
@input-filter
Add, update, remove pre-filter
-
参数:
newFile: File | Object | undefined读写oldFile: File | Object | undefined只读prevent: Function调用该方法 阻止修改
-
详细:
如果
newFile值为undefined则是删除
如果oldFile值为undefined则是添加
如果newFile,oldFile都存在则是更新事件内同步处理请直接修改
newFile
事件内异步处理请使用update,add,remove,clear方法
异步请先设置一个错误以防止被上传同步不能使用
update,add,remove,clear方法
异步不能修改newFile -
示例:
<template> <ul> <li v-for="file in files"> <img :src="file.blob" width="50" height="50" /> </li> </ul> <file-upload :value="files" @input-filter="inputFilter"></file-upload> </template> <script> export default { data() { return { files: [] } }, methods: { inputFilter(newFile, oldFile, prevent) { if (newFile && !oldFile) { // 添加文件 // 过滤非图片文件 // 不会添加到 files 去 if (!/\.(jpeg|jpe|jpg|gif|png|webp)$/i.test(newFile.name)) { return prevent() } // 创建 `blob` 字段 用于缩略图预览 newFile.blob = '' let URL = window.URL || window.webkitURL if (URL && URL.createObjectURL) { newFile.blob = URL.createObjectURL(newFile.file) } } if (newFile && oldFile) { // 更新文件 // 增加版本号 if (!newFile.version) { newFile.version = 0 } newFile.version++ } if (!newFile && oldFile) { // 移除文件 // 拒绝删除文件 // return prevent() } } } } </script>
@input-file
添加,更新,移除 后
-
参数:
newFile: File | Object | undefined只读oldFile: File | Object | undefined只读
-
详细:
如果
newFile值为undefined则是删除
如果oldFile值为undefined则是添加
如果newFile,oldFile都存在则是更新事件内可使用
update,add,remove,clear方法
事件内不可修改newFile对象
事件内不可修改oldFile对象 -
示例:
<template> <file-upload ref="upload" v-model="files" @input-file="inputFile"></file-upload> </template> <script> export default { data() { return { files: [] } }, methods: { inputFile(newFile, oldFile) { if (newFile && !oldFile) { // 添加文件 } if (newFile && oldFile) { // 更新文件 // 开始上传 if (newFile.active !== oldFile.active) { console.log('Start upload', newFile.active, newFile) // 限定最小字节 if (newFile.size >= 0 && newFile.size < 100 * 1024) { newFile = this.$refs.upload.update(newFile, {error: 'size'}) } } // 上传进度 if (newFile.progress !== oldFile.progress) { console.log('progress', newFile.progress, newFile) } // 上传错误 if (newFile.error !== oldFile.error) { console.log('error', newFile.error, newFile) } // 上传成功 if (newFile.success !== oldFile.success) { console.log('success', newFile.success, newFile) } } if (!newFile && oldFile) { // 删除文件 // 自动删除 服务器上的文件 if (oldFile.success && oldFile.response.id) { // $.ajax({ // type: 'DELETE', // url: '/file/delete?id=' + oldFile.response.id, // }); } } // 自动上传 if (Boolean(newFile) !== Boolean(oldFile) || oldFile.error !== newFile.error) { if (!this.$refs.upload.active) { this.$refs.upload.active = true } } } } } </script>
实例 / 数据
features
用于判断浏览器支持的特性
-
类型:
Object -
只读:
true -
默认值:
{ html5: true, directory: false, drag: false } -
示例:
<app> <file-upload ref="upload"></file-upload> <span v-show="$refs.upload && $refs.upload.features.drag">支持拖拽上传</span> <span v-show="$refs.upload && $refs.upload.features.directory">支持文件夹上传</span> <span v-show="$refs.upload && $refs.upload.features.html5">支持HTML5</span> </app>
active
激活或停止上传
-
类型:
Boolean -
只读:
false -
默认值:
false -
示例:
<app> <file-upload ref="upload"></file-upload> <span v-if="!$refs.upload || !$refs.upload.active" @click="$refs.upload.active = true">开始上传</span> <span v-else @click="$refs.upload.active = false">停止上传</span> </app>
dropActive
是否正在拖拽
-
类型:
Boolean -
只读:
true -
默认值:
false -
示例:
<app> <file-upload ref="upload" :drop="true"></file-upload> <span v-show="$refs.upload && $refs.upload.dropActive">拖拽到这里上传</span> </app>
uploaded
是否全部已上传
-
类型:
Boolean -
只读:
true -
默认值:
true -
示例:
<app> <file-upload ref="upload"></file-upload> <span v-show="$refs.upload && $refs.upload.uploaded">全部文件已上传完毕</span> </app>
实例 / 方法
get()
使用id获得某个对象
-
参数:
id: File | Object | String
-
结果:
File | Object | Boolean存在返回文件对象否则返回false
add()
添加一个或多个文件
-
参数:
files: Array<File | window.File | Object> | File | window.File | Object如果它是一个数组的响应将是一个数组index: Number | Boolean=props.add-indextrue =开始位置,false =结束位置,Number =下标位置
-
结果:
Object | Array<File | Object> | Boolean传入的是数组返回数组否则对象或false -
示例:
<template> <ul> <li v-for="file in files"> <span>{{file.name}}</span> </li> </ul> <file-upload v-model="files"></file-upload> <button type="button" @click.prevent="addText">添加文件</button> </template> <script> export default { data() { return { files: [] } }, methods: { addText() { let file = new window.File(['foo'], 'foo.txt', { type: "text/plain", }) this.$refs.upload.add(file) } } } </script>
addInputFile()
把<input type="file">选择的文件添加进上传列表
-
参数:
el: HTMLInputElement文件元素
-
结果:
Array<File>返回已添加的文件列表 -
版本: :
>=2.5.1
addDataTransfer()
把拖拽或者粘贴的数据的文件添加进上传列表
-
参数:
dataTransfer: DataTransfer拖拽或者粘贴的数据
-
结果:
Promise<Array<File>>返回已添加的文件列表 -
版本: :
>=2.5.1
update()
更新某个对象
-
参数:
id: File | Object | Stringdata: Object更新的数据对象
-
结果:
Object | Boolean成功返回newFile失败返回false -
示例:
<template> <ul> <li v-for="file in files"> <span>{{file.name}}</span> <button v-show="file.active" type="button" @click.prevent="abort(file)">停止</button> </li> </ul> <file-upload v-model="files"></file-upload> </template> <script> export default { data() { return { files: [] } }, methods: { abort(file) { this.$refs.upload.update(file, {active: false}) // 或 // this.$refs.upload.update(file, {error: 'abort'}) } } } </script>
remove()
移除某个文件对象
-
参数:
id: File | Object | String
-
结果:
Object | Boolean成功返回oldFile失败返回false -
示例:
<template> <ul> <li v-for="file in files"> <span>{{file.name}}</span> <button type="button" @click.prevent="remove(file)">移除</button> </li> </ul> <file-upload v-model="files"></file-upload> </template> <script> export default { data() { return { files: [] } }, methods: { remove(file) { this.$refs.upload.remove(file) } } } </script>
replace()
替换两个文件的位置
-
参数:
id1: File | Object | Stringid2: File | Object | String
-
结果:
Boolean
clear()
清空文件列表
- 结果:
Boolean总是返回true
实例 / File
文件对象在
input-filter事件外修改请使用update方法
fileObject
-
类型:
Boolean -
只读:
true -
Required:
true -
默认值:
true -
版本: :
>=2.6.0 -
详细:
如果属性不存在,则不会在内部处理该对象
如果属性不存在,它不是File而是Object
id
文件id
-
类型:
String | Number -
只读:
false -
默认值:
Math.random().toString(36).substr(2) -
详细:
idcan not be repeated
Upload can not modifyid
size
文件大小
-
类型:
Number -
只读:
false -
默认值:
-1 -
浏览器:
> IE9
name
文件名
-
类型:
String -
只读:
false -
默认值:
-
详细:
格式:
directory/filename.giffilename.gif
type
MIME类型
-
类型:
String -
只读:
false -
默认值:
-
浏览器:
> IE9 -
详细:
格式:
image/gifimage/pngtext/html
active
激活或终止上传
-
类型:
Boolean -
只读:
false -
默认值:
false -
详细:
true= 上传
false= 停止
error
上传失败错误代码
-
类型:
String -
只读:
false -
默认值:
-
详细:
内置
size,extension,timeout,abort,network,server,denied
success
是否上传成功
-
类型:
Boolean -
只读:
false -
默认值:
false
putAction
自定义当前文件 PUT 地址
-
类型:
String -
只读:
false -
默认值:
this.putAction
postAction
自定义当前文件 POST 地址
-
类型:
String -
只读:
false -
默认值:
this.postAction
headers
自定义当前文件 HTTP Header
-
类型:
Object -
只读:
false -
默认值:
this.headers
data
自定义当前文件 body 或 query 附加内容
-
类型:
Object -
只读:
false -
默认值:
this.data
timeout
自定义当前单个文件的上传超时时间
-
类型:
Number -
只读:
false -
默认值:
this.timeout
response
响应的数据
-
类型:
Object | String -
只读:
false -
默认值:
{}
progress
上传进度
-
类型:
String -
只读:
false -
默认值:
0.00 -
浏览器:
> IE9
speed
每秒的上传速度
-
类型:
Number -
只读:
true -
默认值:
0 -
浏览器:
> IE9
xhr
HTML5 上传 XMLHttpRequest 对象
-
类型:
XMLHttpRequest -
只读:
true -
默认值:
undefined -
浏览器:
> IE9
iframe
HTML4 上传 iframe 元素
-
类型:
Element -
只读:
true -
默认值:
undefined -
浏览器:
= IE9