info
This commit is contained in:
@@ -0,0 +1,17 @@
|
||||
class UploadProvider {
|
||||
constructor() {
|
||||
this.callbacks = {}
|
||||
}
|
||||
|
||||
on (event, callback) {
|
||||
this.callbacks[event] = callback
|
||||
}
|
||||
|
||||
emit (event, data) {
|
||||
if (this.callbacks[event]) {
|
||||
this.callbacks[event](data)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export default UploadProvider
|
||||
@@ -0,0 +1,14 @@
|
||||
import InternalUploadProvider from './internal'
|
||||
import QiniuUploadProvider from './qiniu'
|
||||
function createUploaderProviderInstance (provider) {
|
||||
switch (provider) {
|
||||
case 'internal':
|
||||
return new InternalUploadProvider()
|
||||
case 'qiniu':
|
||||
return new QiniuUploadProvider()
|
||||
default:
|
||||
return new InternalUploadProvider()
|
||||
}
|
||||
}
|
||||
|
||||
export default createUploaderProviderInstance
|
||||
@@ -0,0 +1,81 @@
|
||||
import BaseProvider from './base';
|
||||
|
||||
const uniMediaLibraryCo = uniCloud.importObject('uni-media-library-co', {
|
||||
customUI: true
|
||||
})
|
||||
|
||||
class InternalUploadProvider extends BaseProvider {
|
||||
async upload (files) {
|
||||
for (let i = 0; i < files.length; i++) {
|
||||
const file = files[i]
|
||||
const ext = await file.getFileType()
|
||||
|
||||
try {
|
||||
const result = await uniCloud.uploadFile({
|
||||
filePath: file.originUrl,
|
||||
fileType: file.mediaType,
|
||||
cloudPathAsRealPath: true,
|
||||
cloudPath: `uni-media-library/${Date.now()}.${ext}`,
|
||||
onUploadProgress: (progressEvent) => {
|
||||
file.setStatus('uploading')
|
||||
file.setPercent(Math.floor((progressEvent.loaded / progressEvent.total) * 100))
|
||||
this.emit('progress', file)
|
||||
}
|
||||
})
|
||||
file.setStatus('uploaded')
|
||||
file.setUrl(result.fileID)
|
||||
file.setPercent(100)
|
||||
} catch (e) {
|
||||
file.setStatus('failed')
|
||||
file.setError(e)
|
||||
console.error(e)
|
||||
}
|
||||
|
||||
if ((i + 1) === files.length) {
|
||||
this.emit('success', files)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async cloudUpload (files, options) {
|
||||
const { imageLibraryProvider } = options
|
||||
for (let i = 0; i < files.length; i++) {
|
||||
const file = files[i]
|
||||
|
||||
try {
|
||||
file.setStatus('uploading')
|
||||
file.setPercent(0)
|
||||
this.emit('progress', file)
|
||||
|
||||
const result = await uniMediaLibraryCo.uploadImage({
|
||||
url: file.originUrl,
|
||||
id: file.id,
|
||||
provider: imageLibraryProvider
|
||||
})
|
||||
|
||||
if (!result.data.fileID) {
|
||||
file.setStatus('failed')
|
||||
file.setError(new Error('上传失败'))
|
||||
this.emit('error', file)
|
||||
return
|
||||
}
|
||||
|
||||
file.setStatus('uploaded')
|
||||
file.setUrl(result.data.fileID)
|
||||
file.setPercent(100)
|
||||
file.setAttributes(result.data.detail)
|
||||
} catch (e) {
|
||||
file.setStatus('failed')
|
||||
file.setError(e)
|
||||
console.error(e)
|
||||
this.emit('error', file)
|
||||
}
|
||||
|
||||
if ((i + 1) === files.length) {
|
||||
this.emit('success', files)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export default InternalUploadProvider
|
||||
@@ -0,0 +1,5 @@
|
||||
import BaseProvider from './base';
|
||||
|
||||
class QiniuUploadProvider extends BaseProvider {}
|
||||
|
||||
export default QiniuUploadProvider
|
||||
Reference in New Issue
Block a user