合同小程序前端代码仓库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

292 lines
8.2 KiB

// @ts-nocheck
import { UploadFile, ChooseFileOptions, Oversize } from './type'
// import { chooseFile, ChooseFileOption, ChooseFileSuccessCallbackResult } from '@/uni_modules/lime-choose-file'
/**
* 由于小程序暂时在ios上不支持返回上传文件的fileType,这里用文件的后缀来判断
* @param mediaType
* @param tempFilePath
* @returns string
* @link https://developers.weixin.qq.com/community/develop/doc/00042820b28ee8fb41fc4d0c254c00
*/
export function getFileType(tempFilePath : string, fileType ?: string) : string {
if (fileType != null) return fileType.replace(/\/.+/,''); // 如果有返回fileType就直接用
// 否则根据文件后缀进行判读
const videoType = ['avi', 'wmv', 'mkv', 'mp4', 'mov', 'rm', '3gp', 'flv', 'mpg', 'rmvb'];
const temp = tempFilePath.split('.');
const postfix = temp[temp.length - 1];
if (videoType.includes(postfix.toLocaleLowerCase())) {
return 'video';
}
return 'image';
}
// 选中文件之后,计算一个随机的短文件名
// export function getRandFileName(filePath: string):string {
// const extIndex = filePath.lastIndexOf('.');
// const extName = extIndex === -1 ? '' : filePath.substr(extIndex);
// return parseInt(`${Date.now()}${Math.floor(Math.random() * 900 + 100)}`, 10).toString(36) + extName;
// }
export function getFileName(filePath: string): string {
return filePath.substring(filePath.lastIndexOf('/') + 1)
}
export const isOverSize = (size:number, sizeLimit:number|null):boolean => {
if (sizeLimit == null) return false;
const base = 1000;
// const unitMap = {
// B: 1,
// KB: base,
// MB: base * base,
// GB: base * base * base,
// };
const computedSize = sizeLimit * base
// const computedSize = typeof sizeLimit == 'number' ? sizeLimit * base : sizeLimit?.size * unitMap[sizeLimit?.unit ?? 'KB']; // 单位 KB
return size > computedSize;
};
export function chooseImage(opts : ChooseFileOptions) {
// #ifdef MP-WEIXIN
uni.chooseMedia({
...opts,
mediaType: ['image'],
})
// #endif
// #ifndef MP-WEIXIN
uni.chooseImage({
count: opts.count,
sizeType: opts.sizeType,
sourceType: opts.sourceType,
extension: opts.extension,
success(res){
opts.success?.(res)
},
fail(err) {
opts.fail?.(err)
}
})
// #endif
}
export function chooseVideo(opts : ChooseFileOptions) {
// #ifdef MP-WEIXIN
uni.chooseMedia({
...opts,
mediaType: ['video'],
maxDuration: opts.maxDuration ?? 10,
})
// #endif
// #ifndef MP-WEIXIN
uni.chooseVideo({
sourceType: opts.sourceType,
// #ifndef APP-ANDROID || APP-IOS
// compressed: opts.compressed ?? true,
maxDuration: opts.maxDuration ?? 10,
camera: opts.camera ?? 'back',
// extension: opts.extension,
// #endif
success(res){
opts.success?.(res)
},
fail(err) {
opts.fail?.(err)
}
})
// #endif
}
export function chooseAll(opts : ChooseFileOptions) {
// #ifdef MP-WEIXIN
uni.chooseMessageFile({
...opts,
type: 'all',
})
// #endif
// #ifndef MP-WEIXIN || APP-IOS || APP-ANDROID
uni.chooseFile({
count: opts.count,
type: 'all',
success(res) {
opts.success?.(res)
},
fail(err) {
opts.fail?.(err)
}
} as ChooseFileOption)
// #endif
// #ifdef APP-ANDROID
// uni.chooseFile({
// count: opts.count,
// type: 'all',
// success(res) {
// opts.success?.(res)
// },
// fail(err) {
// opts.fail?.(err)
// }
// })
// #endif
// #ifdef uniVersion >= 4.51
// #ifdef APP-IOS || APP-ANDROID
uni.chooseMedia({
count: opts.count,
mediaType: [opts.mediaType],
sourceType: opts.sourceType,
maxDuration: opts.maxDuration ?? 10,
camera: opts.camera ?? 'back',
success(res) {
opts.success?.(res)
},
fail(err) {
opts.fail?.(err)
}
})
// opts.fail?.('当前环境不支持')
// chooseFile({
// count: opts.count,
// type: 'all',
// success(res) {
// opts.success?.(res)
// },
// fail(err) {
// opts.fail?.(err)
// }
// } as ChooseFileOption)
// #endif
// #endif
}
function normalizeChooseFiles(
type: string,
tempFiles: UTSJSONObject[], //ChooseImageTempFile
tempFilePaths:string[],
sizeLimit:number|null,
oversize: Oversize | null
):UploadFile[]{
const files : UploadFile[] = [];
tempFiles.forEach((temp, index) =>{
const tempFilePath = (temp['tempFilePath'] as string | null) ?? tempFilePaths[index]
const name = (temp['name'] as string | null) ?? getFileName(tempFilePath);
const size = (temp['size'] as number | null) ?? 0;
const width = (temp['width'] as number | null);
const height = (temp['height'] as number | null)
const duration = (temp['duration'] as number | null);
const path = (temp['path'] as string | null) ?? tempFilePath;
const thumb = (temp['thumbTempFilePath'] as string | null);
const _type = (type == 'all' ? getFileType(tempFilePath, temp['type'] as string | null) : type) as "video" | "image";
if (isOverSize(size, sizeLimit)) {
oversize?.(temp)
return
};
files.push({
name,
type: _type,
url: path,
path,
size,
width,
height,
duration,
thumb,
percent: 0,
// status: 'done'
} as UploadFile)
})
return files
}
export function chooseFiles(opts: ChooseFileOptions):Promise<UploadFile[]> {
return new Promise((resolve, reject)=>{
if(opts.mediaType == 'image') {
chooseImage({
count: opts.count,
mediaType: opts.mediaType,
sizeType: opts.sizeType,
sourceType: opts.sourceType,
success(result: any){
const res = result as ChooseImageSuccess
// #ifndef APP-ANDROID || APP-IOS
const tempFiles = res.tempFiles as UTSJSONObject[]
const tempFilePaths = (res.tempFilePaths ?? []) as string[]
// #endif
// #ifdef APP-ANDROID || APP-IOS
const tempFilePaths = res.tempFilePaths
const tempFiles = res.tempFiles.map((item):UTSJSONObject => {
return {
name: item.name,
path: item.path,
size: item.size,
type: item.type
}
})
// #endif
const files = normalizeChooseFiles('image', tempFiles, tempFilePaths, opts.sizeLimit, opts.oversize)
resolve(files)
}
} as ChooseFileOptions)
} else if(opts.mediaType == 'video') {
chooseVideo({
count: opts.count,
mediaType: opts.mediaType,
sourceType: opts.sourceType,
sizeType: opts.sizeType,
maxDuration: opts.maxDuration,
success(result) {
const res = result as ChooseVideoSuccess
// #ifndef APP-ANDROID || APP-IOS
const tempFilePaths = res.tempFilePaths ?? [res.tempFilePath] as string[]
const tempFiles = res.tempFiles ?? [res.tempFile] as UTSJSONObject[]
// #endif
// #ifdef APP-ANDROID || APP-IOS
const tempFilePaths = [res.tempFilePath] as string[]
const {tempFilePath, duration, size, height, width} = res
const tempFiles = [{path: tempFilePath, duration, duration, size, height, width}] as UTSJSONObject[]
// #endif
const files = normalizeChooseFiles('video', tempFiles, tempFilePaths, opts.sizeLimit, opts.oversize)
resolve(files)
}
} as ChooseFileOptions)
} else {
chooseAll({
count: opts.count,
mediaType: opts.mediaType,
sourceType: opts.sourceType,
sizeType: opts.sizeType,
success(result: any){
// #ifndef APP-ANDROID || APP-IOS
const res = result as ChooseFileSuccessCallbackResult
const tempFilePaths = res.tempFiles
const tempFiles = res.tempFiles
const files = normalizeChooseFiles('all', tempFiles, tempFilePaths, opts.sizeLimit, opts.oversize)
resolve(files)
// #endif
// #ifdef uniVersion < 4.51
reject('当前环境不支持')
// const tempFilePaths = res.tempFiles.map((it):string => it.path)
// const tempFiles = res.tempFiles.map((it):UTSJSONObject => ({name: it.name, path: it.path, size: it.size, type: it.type}));
// #endif
// #ifdef uniVersion >= 4.51
// #ifdef APP-ANDROID || APP-IOS
const res = result as ChooseMediaSuccess // ChooseFileSuccess
const tempFilePaths = res.tempFiles.map((it):string => it.tempFilePath)
const tempFiles = res.tempFiles.map((it):UTSJSONObject => ({path: it.tempFilePath, size: it.size}));
const files = normalizeChooseFiles('all', tempFiles, tempFilePaths, opts.sizeLimit, opts.oversize)
resolve(files)
// #endif
// #endif
}
} as ChooseFileOptions)
}
})
}