提交 190883af 编写于 作者: Anne_LXM's avatar Anne_LXM 提交者: Anne_LXM

更新uni-file-picker

上级 049a0063
## 1.0.3(2022-12-21) ## 1.0.11(2024-07-19)
- 修复 vue3 使用value报错的bug
## 1.0.10(2024-07-09)
- 优化 vue3兼容性
## 1.0.9(2024-07-09)
- 修复 value 属性不兼容vue3的bug
## 1.0.8(2024-03-20)
- 补充 删除文件时返回文件下标
## 1.0.7(2024-02-21)
- 新增 微信小程序选择视频时改用chooseMedia,并返回视频缩略图
## 1.0.6(2024-01-06)
- 新增 微信小程序不再调用chooseImage,而是调用chooseMedia
## 1.0.5(2024-01-03)
- 新增 上传文件至云存储携带本地文件名称
## 1.0.4(2023-03-29)
- 修复 手动上传删除一个文件后不能再上传的bug
## 1.0.3(2022-12-19)
- 新增 sourceType 属性, 可以自定义图片和视频选择的来源 - 新增 sourceType 属性, 可以自定义图片和视频选择的来源
## 1.0.2(2022-07-04) ## 1.0.2(2022-07-04)
- 修复 在uni-forms下样式不生效的bug - 修复 在uni-forms下样式不生效的bug
......
...@@ -11,6 +11,28 @@ function chooseImage(opts) { ...@@ -11,6 +11,28 @@ function chooseImage(opts) {
extension extension
} = opts } = opts
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
// 微信由于旧接口不再维护,针对微信小程序平台改用chooseMedia接口
// #ifdef MP-WEIXIN
uni.chooseMedia({
count,
sizeType,
sourceType,
mediaType: ['image'],
extension,
success(res) {
res.tempFiles.forEach(item => {
item.path = item.tempFilePath;
})
resolve(normalizeChooseAndUploadFileRes(res, 'image'));
},
fail(res) {
reject({
errMsg: res.errMsg.replace('chooseImage:fail', ERR_MSG_FAIL),
});
},
})
// #endif
// #ifndef MP-WEIXIN
uni.chooseImage({ uni.chooseImage({
count, count,
sizeType, sizeType,
...@@ -25,11 +47,14 @@ function chooseImage(opts) { ...@@ -25,11 +47,14 @@ function chooseImage(opts) {
}); });
}, },
}); });
// #endif
}); });
} }
function chooseVideo(opts) { function chooseVideo(opts) {
const { const {
count,
camera, camera,
compressed, compressed,
maxDuration, maxDuration,
...@@ -37,6 +62,45 @@ function chooseVideo(opts) { ...@@ -37,6 +62,45 @@ function chooseVideo(opts) {
extension extension
} = opts; } = opts;
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
// 微信由于旧接口不再维护,针对微信小程序平台改用chooseMedia接口
// #ifdef MP-WEIXIN
uni.chooseMedia({
count,
compressed,
maxDuration,
sourceType,
extension,
mediaType: ['video'],
success(res) {
const {
tempFiles,
} = res;
resolve(normalizeChooseAndUploadFileRes({
errMsg: 'chooseVideo:ok',
tempFiles: tempFiles.map(item => {
return {
name: item.name || '',
path: item.tempFilePath,
thumbTempFilePath: item.thumbTempFilePath,
size:item.size,
type: (res.tempFile && res.tempFile.type) || '',
width:item.width,
height:item.height,
duration:item.duration,
fileType: 'video',
cloudPath: '',
}
}),
}, 'video'));
},
fail(res) {
reject({
errMsg: res.errMsg.replace('chooseVideo:fail', ERR_MSG_FAIL),
});
},
})
// #endif
// #ifndef MP-WEIXIN
uni.chooseVideo({ uni.chooseVideo({
camera, camera,
compressed, compressed,
...@@ -54,8 +118,7 @@ function chooseVideo(opts) { ...@@ -54,8 +118,7 @@ function chooseVideo(opts) {
resolve(normalizeChooseAndUploadFileRes({ resolve(normalizeChooseAndUploadFileRes({
errMsg: 'chooseVideo:ok', errMsg: 'chooseVideo:ok',
tempFilePaths: [tempFilePath], tempFilePaths: [tempFilePath],
tempFiles: [ tempFiles: [{
{
name: (res.tempFile && res.tempFile.name) || '', name: (res.tempFile && res.tempFile.name) || '',
path: tempFilePath, path: tempFilePath,
size, size,
...@@ -74,6 +137,7 @@ function chooseVideo(opts) { ...@@ -74,6 +137,7 @@ function chooseVideo(opts) {
}); });
}, },
}); });
// #endif
}); });
} }
...@@ -211,8 +275,7 @@ function chooseAndUploadFile(opts = { ...@@ -211,8 +275,7 @@ function chooseAndUploadFile(opts = {
}) { }) {
if (opts.type === 'image') { if (opts.type === 'image') {
return uploadFiles(chooseImage(opts), opts); return uploadFiles(chooseImage(opts), opts);
} } else if (opts.type === 'video') {
else if (opts.type === 'video') {
return uploadFiles(chooseVideo(opts), opts); return uploadFiles(chooseVideo(opts), opts);
} }
return uploadFiles(chooseAll(opts), opts); return uploadFiles(chooseAll(opts), opts);
......
...@@ -89,24 +89,18 @@ ...@@ -89,24 +89,18 @@
}, },
emits: ['select', 'success', 'fail', 'progress', 'delete', 'update:modelValue', 'input'], emits: ['select', 'success', 'fail', 'progress', 'delete', 'update:modelValue', 'input'],
props: { props: {
// #ifdef VUE3
modelValue: { modelValue: {
type: [Array, Object], type: [Array, Object],
default () { default () {
return [] return []
} }
}, },
// #endif
// #ifndef VUE3
value: { value: {
type: [Array, Object], type: [Array, Object],
default () { default () {
return [] return []
} }
}, },
// #endif
disabled: { disabled: {
type: Boolean, type: Boolean,
default: false default: false
...@@ -191,6 +185,10 @@ ...@@ -191,6 +185,10 @@
default () { default () {
return ['album', 'camera'] return ['album', 'camera']
} }
},
provider: {
type: String,
default: '' // 默认上传到 unicloud 内置存储 extStorage 扩展存储
} }
}, },
data() { data() {
...@@ -200,22 +198,18 @@ ...@@ -200,22 +198,18 @@
} }
}, },
watch: { watch: {
// #ifndef VUE3
value: { value: {
handler(newVal, oldVal) { handler(newVal, oldVal) {
this.setValue(newVal, oldVal) this.setValue(newVal, oldVal)
}, },
immediate: true immediate: true
}, },
// #endif
// #ifdef VUE3
modelValue: { modelValue: {
handler(newVal, oldVal) { handler(newVal, oldVal) {
this.setValue(newVal, oldVal) this.setValue(newVal, oldVal)
}, },
immediate: true immediate: true
}, },
// #endif
}, },
computed: { computed: {
filesList() { filesList() {
...@@ -331,7 +325,6 @@ ...@@ -331,7 +325,6 @@
* 选择文件 * 选择文件
*/ */
choose() { choose() {
if (this.disabled) return if (this.disabled) return
if (this.files.length >= Number(this.limitLength) && this.showType !== 'grid' && this.returnType === if (this.files.length >= Number(this.limitLength) && this.showType !== 'grid' && this.returnType ===
'array') { 'array') {
...@@ -418,6 +411,13 @@ ...@@ -418,6 +411,13 @@
if (!this.autoUpload || this.noSpace) { if (!this.autoUpload || this.noSpace) {
res.tempFiles = [] res.tempFiles = []
} }
res.tempFiles.forEach((fileItem, index) => {
this.provider && (fileItem.provider = this.provider);
const fileNameSplit = fileItem.name.split('.')
const ext = fileNameSplit.pop()
const fileName = fileNameSplit.join('.').replace(/[\s\/\?<>\\:\*\|":]/g, '_')
fileItem.cloudPath = fileName + '_' + Date.now() + '_' + index + '.' + ext
})
}, },
/** /**
...@@ -523,6 +523,7 @@ ...@@ -523,6 +523,7 @@
*/ */
delFile(index) { delFile(index) {
this.$emit('delete', { this.$emit('delete', {
index,
tempFile: this.files[index], tempFile: this.files[index],
tempFilePath: this.files[index].url tempFilePath: this.files[index].url
}) })
......
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
<view v-if="(item.progress && item.progress !== 100) ||item.progress===0 " class="file-picker__progress"> <view v-if="(item.progress && item.progress !== 100) ||item.progress===0 " class="file-picker__progress">
<progress class="file-picker__progress-item" :percent="item.progress === -1?0:item.progress" stroke-width="4" <progress class="file-picker__progress-item" :percent="item.progress === -1?0:item.progress" stroke-width="4"
:backgroundColor="item.errMsg?'#ff5a5f':'#EBEBEB'" /> :backgroundColor="item.errMsg?'#ff5a5f':'#EBEBEB'" />
</view> </view>
<view v-if="item.status === 'error'" class="file-picker__mask" @click.stop="uploadFiles(item,index)"> <view v-if="item.status === 'error'" class="file-picker__mask" @click.stop="uploadFiles(item,index)">
点击重试 点击重试
</view> </view>
...@@ -69,10 +69,10 @@ ...@@ -69,10 +69,10 @@
borderStyle: {} borderStyle: {}
} }
} }
}, },
readonly:{ readonly:{
type:Boolean, type:Boolean,
default:false default:false
} }
}, },
computed: { computed: {
...@@ -114,7 +114,7 @@ ...@@ -114,7 +114,7 @@
let classles = '' let classles = ''
for (let i in obj) { for (let i in obj) {
classles += `${i}:${obj[i]};` classles += `${i}:${obj[i]};`
} }
return classles return classles
}, },
borderLineStyle() { borderLineStyle() {
...@@ -133,19 +133,19 @@ ...@@ -133,19 +133,19 @@
} else { } else {
width = width.indexOf('px') ? width : width + 'px' width = width.indexOf('px') ? width : width + 'px'
} }
obj['border-width'] = width obj['border-width'] = width
if (typeof style === 'number') { if (typeof style === 'number') {
style += 'px' style += 'px'
} else { } else {
style = style.indexOf('px') ? style : style + 'px' style = style.indexOf('px') ? style : style + 'px'
} }
obj['border-top-style'] = style obj['border-top-style'] = style
} }
let classles = '' let classles = ''
for (let i in obj) { for (let i in obj) {
classles += `${i}:${obj[i]};` classles += `${i}:${obj[i]};`
} }
return classles return classles
} }
}, },
...@@ -176,9 +176,9 @@ ...@@ -176,9 +176,9 @@
</script> </script>
<style lang="scss"> <style lang="scss">
.uni-file-picker__files { .uni-file-picker__files {
/* #ifndef APP-NVUE */ /* #ifndef APP-NVUE */
display: flex; display: flex;
/* #endif */ /* #endif */
flex-direction: column; flex-direction: column;
justify-content: flex-start; justify-content: flex-start;
...@@ -194,9 +194,9 @@ ...@@ -194,9 +194,9 @@
overflow: hidden; overflow: hidden;
} }
.file-picker__mask { .file-picker__mask {
/* #ifndef APP-NVUE */ /* #ifndef APP-NVUE */
display: flex; display: flex;
/* #endif */ /* #endif */
justify-content: center; justify-content: center;
align-items: center; align-items: center;
...@@ -214,9 +214,9 @@ ...@@ -214,9 +214,9 @@
position: relative; position: relative;
} }
.uni-file-picker__item { .uni-file-picker__item {
/* #ifndef APP-NVUE */ /* #ifndef APP-NVUE */
display: flex; display: flex;
/* #endif */ /* #endif */
align-items: center; align-items: center;
padding: 8px 10px; padding: 8px 10px;
...@@ -232,17 +232,17 @@ ...@@ -232,17 +232,17 @@
flex: 1; flex: 1;
font-size: 14px; font-size: 14px;
color: #666; color: #666;
margin-right: 25px; margin-right: 25px;
/* #ifndef APP-NVUE */ /* #ifndef APP-NVUE */
word-break: break-all; word-break: break-all;
word-wrap: break-word; word-wrap: break-word;
/* #endif */ /* #endif */
} }
.icon-files { .icon-files {
/* #ifndef APP-NVUE */ /* #ifndef APP-NVUE */
position: static; position: static;
background-color: initial; background-color: initial;
/* #endif */ /* #endif */
} }
...@@ -288,10 +288,10 @@ ...@@ -288,10 +288,10 @@
transform: rotate(90deg); transform: rotate(90deg);
} }
.icon-del-box { .icon-del-box {
/* #ifndef APP-NVUE */ /* #ifndef APP-NVUE */
display: flex; display: flex;
margin: auto 0; margin: auto 0;
/* #endif */ /* #endif */
align-items: center; align-items: center;
justify-content: center; justify-content: center;
...@@ -322,4 +322,4 @@ ...@@ -322,4 +322,4 @@
} }
/* #endif */ /* #endif */
</style> </style>
<template> <template>
<view class="uni-file-picker__container"> <view class="uni-file-picker__container">
<view class="file-picker__box" v-for="(item,index) in filesList" :key="index" :style="boxStyle"> <view class="file-picker__box" v-for="(item,index) in filesList" :key="index" :style="boxStyle">
<view class="file-picker__box-content" :style="borderStyle"> <view class="file-picker__box-content" :style="borderStyle">
<image class="file-image" :src="item.url" mode="aspectFill" @click.stop="prviewImage(item,index)"></image> <image class="file-image" :src="item.url" mode="aspectFill" @click.stop="prviewImage(item,index)"></image>
<view v-if="delIcon && !readonly" class="icon-del-box" @click.stop="delFile(index)"> <view v-if="delIcon && !readonly" class="icon-del-box" @click.stop="delFile(index)">
<view class="icon-del"></view> <view class="icon-del"></view>
...@@ -37,10 +37,10 @@ ...@@ -37,10 +37,10 @@
default () { default () {
return [] return []
} }
}, },
disabled:{ disabled:{
type: Boolean, type: Boolean,
default: false default: false
}, },
disablePreview: { disablePreview: {
type: Boolean, type: Boolean,
...@@ -63,10 +63,10 @@ ...@@ -63,10 +63,10 @@
delIcon: { delIcon: {
type: Boolean, type: Boolean,
default: true default: true
}, },
readonly:{ readonly:{
type:Boolean, type:Boolean,
default:false default:false
} }
}, },
computed: { computed: {
...@@ -104,20 +104,20 @@ ...@@ -104,20 +104,20 @@
} }
} else { } else {
obj.width = this.value2px(width) obj.width = this.value2px(width)
} }
let classles = '' let classles = ''
for(let i in obj){ for(let i in obj){
classles+= `${i}:${obj[i]};` classles+= `${i}:${obj[i]};`
} }
return classles return classles
}, },
borderStyle() { borderStyle() {
let { let {
border border
} = this.styles } = this.styles
let obj = {} let obj = {}
const widthDefaultValue = 1 const widthDefaultValue = 1
const radiusDefaultValue = 3 const radiusDefaultValue = 3
if (typeof border === 'boolean') { if (typeof border === 'boolean') {
obj.border = border ? '1px #eee solid' : 'none' obj.border = border ? '1px #eee solid' : 'none'
...@@ -132,10 +132,10 @@ ...@@ -132,10 +132,10 @@
'border-color': (border && border.color) || '#eee', 'border-color': (border && border.color) || '#eee',
'border-radius': radius 'border-radius': radius
} }
} }
let classles = '' let classles = ''
for(let i in obj){ for(let i in obj){
classles+= `${i}:${obj[i]};` classles+= `${i}:${obj[i]};`
} }
return classles return classles
} }
...@@ -151,11 +151,11 @@ ...@@ -151,11 +151,11 @@
this.$emit('delFile', index) this.$emit('delFile', index)
}, },
prviewImage(img, index) { prviewImage(img, index) {
let urls = [] let urls = []
if(Number(this.limit) === 1&&this.disablePreview&&!this.disabled){ if(Number(this.limit) === 1&&this.disablePreview&&!this.disabled){
this.$emit("choose") this.$emit("choose")
} }
if(this.disablePreview) return if(this.disablePreview) return
this.filesList.forEach(i => { this.filesList.forEach(i => {
urls.push(i.url) urls.push(i.url)
}) })
...@@ -180,10 +180,10 @@ ...@@ -180,10 +180,10 @@
</script> </script>
<style lang="scss"> <style lang="scss">
.uni-file-picker__container { .uni-file-picker__container {
/* #ifndef APP-NVUE */ /* #ifndef APP-NVUE */
display: flex; display: flex;
box-sizing: border-box; box-sizing: border-box;
/* #endif */ /* #endif */
flex-wrap: wrap; flex-wrap: wrap;
margin: -5px; margin: -5px;
...@@ -194,9 +194,9 @@ ...@@ -194,9 +194,9 @@
// flex: 0 0 33.3%; // flex: 0 0 33.3%;
width: 33.3%; width: 33.3%;
height: 0; height: 0;
padding-top: 33.33%; padding-top: 33.33%;
/* #ifndef APP-NVUE */ /* #ifndef APP-NVUE */
box-sizing: border-box; box-sizing: border-box;
/* #endif */ /* #endif */
} }
...@@ -225,9 +225,9 @@ ...@@ -225,9 +225,9 @@
width: 100%; width: 100%;
} }
.file-picker__mask { .file-picker__mask {
/* #ifndef APP-NVUE */ /* #ifndef APP-NVUE */
display: flex; display: flex;
/* #endif */ /* #endif */
justify-content: center; justify-content: center;
align-items: center; align-items: center;
...@@ -246,9 +246,9 @@ ...@@ -246,9 +246,9 @@
height: 100%; height: 100%;
} }
.is-add { .is-add {
/* #ifndef APP-NVUE */ /* #ifndef APP-NVUE */
display: flex; display: flex;
/* #endif */ /* #endif */
align-items: center; align-items: center;
justify-content: center; justify-content: center;
...@@ -266,9 +266,9 @@ ...@@ -266,9 +266,9 @@
transform: rotate(90deg); transform: rotate(90deg);
} }
.icon-del-box { .icon-del-box {
/* #ifndef APP-NVUE */ /* #ifndef APP-NVUE */
display: flex; display: flex;
/* #endif */ /* #endif */
align-items: center; align-items: center;
justify-content: center; justify-content: center;
...@@ -289,4 +289,4 @@ ...@@ -289,4 +289,4 @@
background-color: #fff; background-color: #fff;
border-radius: 2px; border-radius: 2px;
} }
</style> </style>
...@@ -90,6 +90,7 @@ export const get_file_data = async (files, type = 'image') => { ...@@ -90,6 +90,7 @@ export const get_file_data = async (files, type = 'image') => {
extname: extname || '', extname: extname || '',
cloudPath: files.cloudPath, cloudPath: files.cloudPath,
fileType: files.fileType, fileType: files.fileType,
thumbTempFilePath: files.thumbTempFilePath,
url: files.path || files.path, url: files.path || files.path,
size: files.size, //单位是字节 size: files.size, //单位是字节
image: {}, image: {},
......
{ {
"id": "uni-file-picker", "id": "uni-file-picker",
"displayName": "uni-file-picker 文件选择上传", "displayName": "uni-file-picker 文件选择上传",
"version": "1.0.3", "version": "1.0.11",
"description": "文件选择上传组件,可以选择图片、视频等任意文件并上传到当前绑定的服务空间", "description": "文件选择上传组件,可以选择图片、视频等任意文件并上传到当前绑定的服务空间",
"keywords": [ "keywords": [
"uni-ui", "uni-ui",
...@@ -42,7 +42,8 @@ ...@@ -42,7 +42,8 @@
"platforms": { "platforms": {
"cloud": { "cloud": {
"tcb": "y", "tcb": "y",
"aliyun": "y" "aliyun": "y",
"alipay": "n"
}, },
"client": { "client": {
"App": { "App": {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册