155 lines
3.7 KiB
JavaScript
155 lines
3.7 KiB
JavaScript
import Uploader from "./base";
|
|
import UploaderFile from "./struct/upload-file";
|
|
|
|
export class FromFileUploader extends Uploader {
|
|
constructor(props) {
|
|
super(props)
|
|
}
|
|
|
|
chooseImage (options) {
|
|
return new Promise((resolve, reject) => {
|
|
uni.chooseImage({
|
|
sizeType: ['original'],
|
|
extension: options.extension,
|
|
success: (res) => {
|
|
resolve(res.tempFiles)
|
|
},
|
|
fail: (e) => {
|
|
reject(e)
|
|
}
|
|
})
|
|
})
|
|
}
|
|
|
|
chooseVideo (options) {
|
|
return new Promise((resolve, reject) => {
|
|
uni.chooseVideo({
|
|
compressed: false,
|
|
extension: options.extension,
|
|
success: (res) => {
|
|
resolve([
|
|
{
|
|
name: (res.tempFile && res.tempFile.name) || 'unknown',
|
|
type: (res.tempFile && res.tempFile.type) || '',
|
|
path: res.tempFilePath,
|
|
duration: res.duration,
|
|
size: res.size,
|
|
height: res.height,
|
|
width: res.width,
|
|
}
|
|
])
|
|
},
|
|
fail: (e) => {
|
|
reject(e)
|
|
}
|
|
})
|
|
})
|
|
}
|
|
|
|
chooseAll (options) {
|
|
return new Promise((resolve, reject) => {
|
|
uni.chooseFile({
|
|
type: 'all',
|
|
extension: options.extension,
|
|
success: (res) => {
|
|
resolve(res.tempFiles)
|
|
},
|
|
fail: (e) => {
|
|
reject(e)
|
|
}
|
|
})
|
|
})
|
|
}
|
|
|
|
async chooseFileAndUpload (options) {
|
|
const {type, onChooseFile, success, fail} = options
|
|
let choosePromise
|
|
|
|
if (type === 'image') {
|
|
choosePromise = this.chooseImage(options)
|
|
} else if (type === 'video') {
|
|
choosePromise = this.chooseVideo(options)
|
|
} else {
|
|
choosePromise = this.chooseAll(options)
|
|
}
|
|
|
|
return choosePromise.then(files => {
|
|
return this.add(files)
|
|
}).then(() => {
|
|
typeof onChooseFile === 'function' && onChooseFile(
|
|
this.waitUploadFiles
|
|
)
|
|
return this.upload()
|
|
}).then(success).catch(fail)
|
|
}
|
|
|
|
getImageInfo(tempFile, fileInfo) {
|
|
return new Promise(resolve => {
|
|
uni.getImageInfo({
|
|
src: fileInfo.originUrl,
|
|
success: (res) => {
|
|
fileInfo.attributes.width = res.width
|
|
fileInfo.attributes.height = res.height
|
|
},
|
|
complete: () => {
|
|
resolve()
|
|
}
|
|
})
|
|
})
|
|
}
|
|
|
|
getVideoInfo(tempFile, fileInfo) {
|
|
return new Promise(resolve => {
|
|
// #ifdef H5
|
|
if (!('duration' in tempFile)) {
|
|
const video = document.createElement('video')
|
|
video.src = fileInfo.originUrl
|
|
// 获取视频的长度/时间
|
|
video.addEventListener('loadedmetadata', () => {
|
|
fileInfo.attributes.duration = video.duration
|
|
fileInfo.attributes.width = video.videoWidth
|
|
fileInfo.attributes.height = video.videoHeight
|
|
|
|
resolve()
|
|
})
|
|
return
|
|
}
|
|
// #endif
|
|
|
|
fileInfo.attributes.duration = tempFile.duration
|
|
fileInfo.attributes.width = tempFile.width
|
|
fileInfo.attributes.height = tempFile.height
|
|
|
|
resolve()
|
|
})
|
|
}
|
|
|
|
async normalizeFiles (files) {
|
|
let newFiles = []
|
|
for (const file of files) {
|
|
const [mediaType = '', fileType] = (file.type || file.fileType)?.split('/') || []
|
|
const fileInfo = {
|
|
name: file.name,
|
|
originUrl: file.path,
|
|
thumbUrl: file.path,
|
|
size: file.size,
|
|
mediaType: mediaType,
|
|
fileType: fileType,
|
|
attributes: {}
|
|
}
|
|
|
|
if (mediaType === 'image') {
|
|
await this.getImageInfo(file, fileInfo)
|
|
} else if (mediaType === 'video') {
|
|
await this.getVideoInfo(file, fileInfo)
|
|
}
|
|
|
|
newFiles.push(
|
|
new UploaderFile(fileInfo)
|
|
)
|
|
}
|
|
|
|
return newFiles
|
|
}
|
|
}
|