// @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 { 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) } }) }