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