Upload 上传
基础例子
uploadRequest
返回一个 Promise
用来接受成功/失败,以 axios
插件为例。
控制台
value:[
{
"name": "GovUi",
"url": "/logo.png"
}
]
查看代码
示例采用模拟 simulateUpload.js
,实际项目可参考 axiosUpload.js
。
vue
<template>
<demo-container>
<gov-upload
:uploadRequest="simulateUpload"
v-model="value"
buttonType="success"
append="上传文件最大 500KB"
/>
<template #console>value:{{ value }}</template>
</demo-container>
</template>
<script setup>
import { ref } from "vue";
// import uploadFile from "./js/axiosUpload.js";
import uploadFile from "./js/simulateUpload.js";
const value = ref([
{
name: "GovUi",
url: "/logo.png",
},
]);
function simulateUpload(file, fileId, onProgress) {
return uploadFile({ myfile: file }, onProgress).then((response) => {
// 返回 url 预览图片;返回 response 后端数据。
return {
url: "/logo.png",
response,
};
});
}
</script>
js
/**
* 模拟上传文件的函数
* @param {Object} files - 文件对象,键为字段名,值为文件(File)对象
* @param {Function} onProgress - 进度回调函数
* @returns {Promise}
*/
function uploadFile(files, onProgress) {
const formData = new FormData();
// 循环遍历文件对象,并将文件添加到FormData中
Object.keys(files).forEach((key) => {
formData.append(key, files[key]);
});
return new Promise((resolve, reject) => {
// 模拟上传进度
let total = 0;
const interval = setInterval(() => {
if (total < 100) {
total += 10;
onProgress(total);
} else {
clearInterval(interval);
// 模拟随机的成功或失败
const success = Math.random() > 0.5 ? true : false;
if (success) {
// 设置预览地址 url;服务器数据 response
resolve({
message: "这是后端返回来的数据",
});
} else {
reject(new Error("Upload failed"));
}
}
}, 500);
});
}
export default uploadFile;
js
/**
* axios 插件上传文件的函数示例
* @param {Object} files - 文件对象,键为字段名,值为文件(File)对象
* @param {Function} onProgress - 进度回调函数
* @returns {Promise}
*/
import axios from "axios";
function uploadFile(files, onProgress) {
const formData = new FormData();
// 循环遍历文件对象,并将文件添加到FormData中
Object.keys(files).forEach((key) => {
formData.append(key, files[key]);
});
return axios({
method: "post",
url: "你的上传接口URL", // 注意替换成你的上传接口URL
data: formData,
headers: { "Content-Type": "multipart/form-data" },
onUploadProgress: ({ loaded, total }) => {
const percentCompleted = Math.round((loaded * 100) / total);
onProgress(percentCompleted);
},
})
.then((response) => {
if (response && response.data) {
return response.data;
} else {
throw new Error("Upload failed");
}
})
.catch((error) => {
throw error;
});
}
export default uploadFile;
设置多选
uploadMultiple
可以设置多选。
查看代码
示例采用模拟 simulateUpload.js
,实际项目可参考 axiosUpload.js
。
vue
<template>
<demo-container>
<gov-upload
v-model="value"
multiple
:uploadRequest="simulateUpload"
buttonType="success"
append="上传文件最大 500KB"
/>
</demo-container>
</template>
<script setup>
import { ref } from "vue";
// import uploadFile from "./js/axiosUpload.js";
import uploadFile from "./js/simulateUpload.js";
const value = ref([]);
function simulateUpload(file, fileId, onProgress) {
return uploadFile({ myfile: file }, onProgress).then((response) => {
// 返回 url 预览图片;返回 response 后端数据。
return {
url: "/logo.png",
response,
};
});
}
</script>
js
/**
* 模拟上传文件的函数
* @param {Object} files - 文件对象,键为字段名,值为文件(File)对象
* @param {Function} onProgress - 进度回调函数
* @returns {Promise}
*/
function uploadFile(files, onProgress) {
const formData = new FormData();
// 循环遍历文件对象,并将文件添加到FormData中
Object.keys(files).forEach((key) => {
formData.append(key, files[key]);
});
return new Promise((resolve, reject) => {
// 模拟上传进度
let total = 0;
const interval = setInterval(() => {
if (total < 100) {
total += 10;
onProgress(total);
} else {
clearInterval(interval);
// 模拟随机的成功或失败
const success = Math.random() > 0.5 ? true : false;
if (success) {
// 设置预览地址 url;服务器数据 response
resolve({
message: "这是后端返回来的数据",
});
} else {
reject(new Error("Upload failed"));
}
}
}, 500);
});
}
export default uploadFile;
js
/**
* axios 插件上传文件的函数示例
* @param {Object} files - 文件对象,键为字段名,值为文件(File)对象
* @param {Function} onProgress - 进度回调函数
* @returns {Promise}
*/
import axios from "axios";
function uploadFile(files, onProgress) {
const formData = new FormData();
// 循环遍历文件对象,并将文件添加到FormData中
Object.keys(files).forEach((key) => {
formData.append(key, files[key]);
});
return axios({
method: "post",
url: "你的上传接口URL", // 注意替换成你的上传接口URL
data: formData,
headers: { "Content-Type": "multipart/form-data" },
onUploadProgress: ({ loaded, total }) => {
const percentCompleted = Math.round((loaded * 100) / total);
onProgress(percentCompleted);
},
})
.then((response) => {
if (response && response.data) {
return response.data;
} else {
throw new Error("Upload failed");
}
})
.catch((error) => {
throw error;
});
}
export default uploadFile;
按钮类型
buttonType
设置上传按钮风格。 buttonSize
设置上传按钮的大小。 buttonText
设置按钮的文字。
查看代码
示例采用模拟 simulateUpload.js
,实际项目可参考 axiosUpload.js
。
vue
<template>
<demo-container>
<gov-upload
v-model="value"
buttonType="default"
:uploadRequest="simulateUpload"
append="上传文件最大 500KB"
/>
<hr />
<gov-upload
v-model="value"
buttonType="primary"
:uploadRequest="simulateUpload"
append="上传文件最大 500KB"
/>
<hr />
<gov-upload
v-model="value"
buttonType="success"
:uploadRequest="simulateUpload"
append="上传文件最大 500KB"
/>
<hr />
<gov-upload
v-model="value"
buttonType="warning"
:uploadRequest="simulateUpload"
append="上传文件最大 500KB"
/>
<hr />
<gov-upload
v-model="value"
buttonType="danger"
:uploadRequest="simulateUpload"
append="上传文件最大 500KB"
/>
<hr />
<gov-upload
v-model="value"
buttonType="info"
:uploadRequest="simulateUpload"
append="上传文件最大 500KB"
/>
</demo-container>
</template>
<script setup>
import { ref } from "vue";
// import uploadFile from "./js/axiosUpload.js";
import uploadFile from "./js/simulateUpload.js";
const value = ref([]);
function simulateUpload(file, fileId, onProgress) {
return uploadFile({ myfile: file }, onProgress).then((response) => {
// 返回 url 预览图片;返回 response 后端数据。
return {
url: "/logo.png",
response,
};
});
}
</script>
js
/**
* 模拟上传文件的函数
* @param {Object} files - 文件对象,键为字段名,值为文件(File)对象
* @param {Function} onProgress - 进度回调函数
* @returns {Promise}
*/
function uploadFile(files, onProgress) {
const formData = new FormData();
// 循环遍历文件对象,并将文件添加到FormData中
Object.keys(files).forEach((key) => {
formData.append(key, files[key]);
});
return new Promise((resolve, reject) => {
// 模拟上传进度
let total = 0;
const interval = setInterval(() => {
if (total < 100) {
total += 10;
onProgress(total);
} else {
clearInterval(interval);
// 模拟随机的成功或失败
const success = Math.random() > 0.5 ? true : false;
if (success) {
// 设置预览地址 url;服务器数据 response
resolve({
message: "这是后端返回来的数据",
});
} else {
reject(new Error("Upload failed"));
}
}
}, 500);
});
}
export default uploadFile;
js
/**
* axios 插件上传文件的函数示例
* @param {Object} files - 文件对象,键为字段名,值为文件(File)对象
* @param {Function} onProgress - 进度回调函数
* @returns {Promise}
*/
import axios from "axios";
function uploadFile(files, onProgress) {
const formData = new FormData();
// 循环遍历文件对象,并将文件添加到FormData中
Object.keys(files).forEach((key) => {
formData.append(key, files[key]);
});
return axios({
method: "post",
url: "你的上传接口URL", // 注意替换成你的上传接口URL
data: formData,
headers: { "Content-Type": "multipart/form-data" },
onUploadProgress: ({ loaded, total }) => {
const percentCompleted = Math.round((loaded * 100) / total);
onProgress(percentCompleted);
},
})
.then((response) => {
if (response && response.data) {
return response.data;
} else {
throw new Error("Upload failed");
}
})
.catch((error) => {
throw error;
});
}
export default uploadFile;
设置禁用
在禁用状态下,上传按钮禁用,没有删除按钮。
查看代码
vue
<template>
<demo-container>
<gov-upload v-model="value" disabled tip="上传文件最大 500KB" />
</demo-container>
</template>
<script setup>
import { ref } from "vue";
const value = ref([
{
name: "GovUi",
url: "/logo.png",
},
]);
</script>
自定义提示
设置 props
或者 <slot />
来定义提示信息。
查看代码
示例采用模拟 simulateUpload.js
,实际项目可参考 axiosUpload.js
。
vue
<template>
<demo-container>
<gov-upload
v-model="value"
:uploadRequest="simulateUpload"
tip="上传文件最大 500KB"
/>
<hr />
<gov-upload v-model="value" :uploadRequest="simulateUpload">
<template #tip>
自定义提示:<i>上传文件最大 <b>500KB</b></i>
</template>
</gov-upload>
<hr />
<gov-upload
v-model="value"
:uploadRequest="simulateUpload"
append="上传文件最大 500KB"
/>
<hr />
<gov-upload v-model="value" :uploadRequest="simulateUpload">
<template #append>
自定义提示:<i>上传文件最大 <b>500KB</b></i>
</template>
</gov-upload>
</demo-container>
</template>
<script setup>
import { ref } from "vue";
// import uploadFile from "./js/axiosUpload.js";
import uploadFile from "./js/simulateUpload.js";
const value = ref([]);
function simulateUpload(file, fileId, onProgress) {
return uploadFile({ myfile: file }, onProgress).then((response) => {
// 返回 url 预览图片;返回 response 后端数据。
return {
url: "/logo.png",
response,
};
});
}
</script>
js
/**
* 模拟上传文件的函数
* @param {Object} files - 文件对象,键为字段名,值为文件(File)对象
* @param {Function} onProgress - 进度回调函数
* @returns {Promise}
*/
function uploadFile(files, onProgress) {
const formData = new FormData();
// 循环遍历文件对象,并将文件添加到FormData中
Object.keys(files).forEach((key) => {
formData.append(key, files[key]);
});
return new Promise((resolve, reject) => {
// 模拟上传进度
let total = 0;
const interval = setInterval(() => {
if (total < 100) {
total += 10;
onProgress(total);
} else {
clearInterval(interval);
// 模拟随机的成功或失败
const success = Math.random() > 0.5 ? true : false;
if (success) {
// 设置预览地址 url;服务器数据 response
resolve({
message: "这是后端返回来的数据",
});
} else {
reject(new Error("Upload failed"));
}
}
}, 500);
});
}
export default uploadFile;
js
/**
* axios 插件上传文件的函数示例
* @param {Object} files - 文件对象,键为字段名,值为文件(File)对象
* @param {Function} onProgress - 进度回调函数
* @returns {Promise}
*/
import axios from "axios";
function uploadFile(files, onProgress) {
const formData = new FormData();
// 循环遍历文件对象,并将文件添加到FormData中
Object.keys(files).forEach((key) => {
formData.append(key, files[key]);
});
return axios({
method: "post",
url: "你的上传接口URL", // 注意替换成你的上传接口URL
data: formData,
headers: { "Content-Type": "multipart/form-data" },
onUploadProgress: ({ loaded, total }) => {
const percentCompleted = Math.round((loaded * 100) / total);
onProgress(percentCompleted);
},
})
.then((response) => {
if (response && response.data) {
return response.data;
} else {
throw new Error("Upload failed");
}
})
.catch((error) => {
throw error;
});
}
export default uploadFile;
Attributes
属性名 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
modelValue | 绑定的值,表示已上传的文件列表 | Array | — | [] |
size | 上传按钮的尺寸 | String | — | — |
disabled | 是否禁用上传功能 | Boolean | true, false | false |
buttonText | 上传按钮的文本 | String | — | "上传文件" |
buttonType | 上传按钮的类型 | String | — | "default" |
tip | 上传组件的提示文本 | String | — | "" |
append | 附加在上传按钮后的文本或元素 | String | — | "" |
uploadRequest | 上传文件的请求函数 | Function | — | null |
multiple | 是否允许多文件上传 | Boolean | true, false | false |
triggerForm | 是否触发表单验证 | Boolean | true, false | true |
Events
事件名 | 说明 | 回调参数 |
---|---|---|
update:modelValue | 绑定值更新时触发 | 新的文件列表 |
change | 文件列表变化时触发 | 新的文件列表 |
delete | 删除文件时触发 | 被删除文件的ID |
focus | 上传组件获得焦点时触发 | — |
blur | 上传组件失去焦点时触发 | — |
Slots
插槽名 | 说明 | 作用域插槽 | 内容 |
---|---|---|---|
append | 上传按钮后的附加内容 | 否 | 可以放置自定义的内容,如文本或图标 |
tip | 上传组件的提示内容 | 否 | 可以放置自定义的提示内容 |