import Taro from '@tarojs/taro';
|
import { ossUpload, OssUploadOptions } from './oss';
|
import { OssMedia } from '@life-payment/constants';
|
import { FileItem } from '@nutui/nutui-taro/dist/types/__VUE/uploader/type';
|
import { guid } from '@life-payment/utils';
|
|
export type ChooseMediaOptions = Taro.chooseMedia.Option & {
|
onSuccess?: (
|
result: Taro.uploadFile.SuccessCallbackResult,
|
ossRes: { path: string; url: string; name: string },
|
options: {
|
file: ChooseFileItem;
|
}
|
) => void;
|
onStart?: (fileList: ChooseFileItem[]) => void;
|
onFail?: (
|
res: TaroGeneral.CallbackResult,
|
options: {
|
file: ChooseFileItem;
|
}
|
) => void;
|
};
|
|
export function chooseMedia(options: ChooseMediaOptions) {
|
const task = Taro.chooseMedia({
|
count: 1,
|
mediaType: ['image'],
|
sourceType: ['album', 'camera'],
|
maxDuration: 30,
|
camera: 'back',
|
...options,
|
success: (res) => {
|
Taro.showLoading({
|
title: '上传中',
|
mask: true,
|
});
|
const fileList = readFiles(res.tempFiles);
|
// console.log('onStart fileList: ', fileList);
|
options.onStart?.(fileList);
|
fileList.forEach((element, _index) => {
|
ossUpload({
|
filePath: element.path,
|
fileDirectory: OssMedia,
|
customFileName: () => element.uid,
|
success(result, ossRes) {
|
// console.log('result element: ', element);
|
options.onSuccess?.(result, ossRes, {
|
file: element,
|
});
|
},
|
fail(e) {
|
options.onFail?.(e, {
|
file: element,
|
});
|
},
|
});
|
});
|
},
|
});
|
}
|
|
interface TFileType {
|
size: number;
|
type?: string;
|
fileType?: string;
|
originalFileObj?: any;
|
tempFilePath?: string;
|
thumbTempFilePath?: string;
|
path?: string;
|
}
|
|
export type ChooseFileItem = FileItem & {
|
previewUrl?: string;
|
};
|
|
function readFiles<T extends TFileType>(files: T[]) {
|
const fileList: ChooseFileItem[] = [];
|
files.forEach((file, index) => {
|
let fileType = file.type;
|
let filepath = (file.tempFilePath || file.path) as string;
|
const fileItem = createFileItem(file);
|
if (file.fileType) {
|
fileType = file.fileType;
|
} else {
|
const imgReg = /\.(png|jpeg|jpg|webp|gif)$/i;
|
if (!fileType && (imgReg.test(filepath) || filepath.includes('data:image'))) {
|
fileType = 'image';
|
}
|
}
|
fileItem.path = filepath;
|
fileItem.name = filepath;
|
fileItem.status = 'ready';
|
fileItem.message = '准备上传';
|
fileItem.type = fileType;
|
fileItem.previewUrl = filepath;
|
fileItem.url = fileType == 'video' ? file.thumbTempFilePath : filepath;
|
fileList.push(fileItem);
|
});
|
|
return fileList;
|
}
|
|
function createFileItem(file: TFileType) {
|
return {
|
status: 'ready',
|
message: '准备上传',
|
uid: guid(),
|
name: '',
|
url: '',
|
previewUrl: '',
|
type: '',
|
path: '',
|
percentage: 100,
|
formData: {},
|
} as ChooseFileItem;
|
}
|
|
export type ChooseImageOptions = Taro.chooseImage.Option & {
|
onSuccess?: OssUploadOptions['success'];
|
};
|
|
export function chooseImage(options: ChooseImageOptions) {
|
Taro.chooseImage({
|
count: 9, // 默认9
|
sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
|
sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有,在H5浏览器端支持使用 `user` 和 `environment`分别指定为前后摄像头
|
success: function (res) {
|
res.tempFilePaths.forEach((element) => {
|
console.log('element: ', element);
|
ossUpload({
|
filePath: element,
|
fileDirectory: OssMedia,
|
success(result, ossRes) {
|
options.onSuccess?.(result, ossRes);
|
},
|
});
|
});
|
},
|
});
|
}
|