提交 e06a7021 编写于 作者: D DCloud_LXH

chore(App): chooseImage、chooseVideo optimize

上级 453b3fe2
import { TEMP_PATH } from '../constants'
import { warpPlusErrorCallback } from '../../../helpers/plus'
import { getFileName } from '../../../helpers/file'
import {
API_TYPE_CHOOSE_IMAGE,
API_CHOOSE_IMAGE,
......@@ -27,30 +26,6 @@ function getFileInfo(filePath: string): Promise<PlusIoMetadata> {
})
}
function compressImage(tempFilePath: string): Promise<string> {
const dst = `${TEMP_PATH}/compressed/${Date.now()}_${getFileName(
tempFilePath
)}`
return new Promise((resolve) => {
plus.nativeUI.showWaiting()
plus.zip.compressImage(
{
src: tempFilePath,
dst,
overwrite: true,
},
() => {
plus.nativeUI.closeWaiting()
resolve(dst)
},
() => {
plus.nativeUI.closeWaiting()
resolve(tempFilePath)
}
)
})
}
type File = {
path: string
size: number
......@@ -58,7 +33,7 @@ type File = {
export const chooseImage = defineAsyncApi<API_TYPE_CHOOSE_IMAGE>(
API_CHOOSE_IMAGE,
// @ts-ignore crop 属性App特有
// @ts-expect-error crop 属性App特有
({ count, sizeType, sourceType, crop } = {}, { resolve, reject }) => {
initI18nChooseImageMsgsOnce()
const { t } = useI18n()
......@@ -86,38 +61,17 @@ export const chooseImage = defineAsyncApi<API_TYPE_CHOOSE_IMAGE>(
function openCamera() {
const camera = plus.camera.getCamera()
camera.captureImage(
(path) => {
// fix By Lxh 暂时添加拍照压缩逻辑,等客户端增加逻辑后修改
// 判断是否需要压缩
if (sizeType && sizeType.includes('compressed')) {
return getFileInfo(path)
.then(({ size }) => {
// 压缩阈值 0.5 兆
const THRESHOLD = 1024 * 1024 * 0.5
return size && size > THRESHOLD
? compressImage(path).then((dstPath) =>
successCallback([dstPath])
)
: successCallback([path])
})
.catch(errorCallback)
}
return successCallback([path])
},
errorCallback,
{
filename: TEMP_PATH + '/camera/',
resolution: 'high',
crop,
}
)
camera.captureImage((path) => successCallback([path]), errorCallback, {
filename: TEMP_PATH + '/camera/',
resolution: 'high',
crop,
// @ts-expect-error
sizeType,
})
}
function openAlbum() {
// NOTE 5+此API分单选和多选,多选返回files:string[]
// @ts-ignore
// @ts-ignore 5+此API分单选和多选,多选返回files:string[]
plus.gallery.pick(({ files }) => successCallback(files), errorCallback, {
maximum: count,
multiple: true,
......
import { TEMP_PATH } from '../constants'
import { warpPlusErrorCallback } from '../../../helpers/plus'
import { getFileName } from '../../../helpers/file'
import { initI18nChooseVideoMsgsOnce, useI18n } from '@dcloudio/uni-core'
import {
API_TYPE_CHOOSE_VIDEO,
......@@ -17,56 +16,28 @@ export const chooseVideo = defineAsyncApi<API_TYPE_CHOOSE_VIDEO>(
const { t } = useI18n()
const errorCallback = warpPlusErrorCallback(reject)
function successCallback(tempFilePath: string = '') {
const filename = `${TEMP_PATH}/compressed/${Date.now()}_${getFileName(
tempFilePath
)}`
const compressVideo: Promise<string> = compressed
? new Promise((resolve) => {
plus.zip.compressVideo(
{
src: tempFilePath,
filename,
quality: 'medium',
},
({ tempFilePath }: { tempFilePath: string }) => {
resolve(tempFilePath)
},
() => {
resolve(tempFilePath)
}
)
})
: Promise.resolve(tempFilePath)
if (compressed) {
plus.nativeUI.showWaiting()
}
compressVideo.then((tempFilePath: string) => {
if (compressed) {
plus.nativeUI.closeWaiting()
}
plus.io.getVideoInfo({
filePath: tempFilePath,
success(videoInfo) {
const result = {
errMsg: 'chooseVideo:ok',
tempFilePath: tempFilePath,
size: videoInfo.size,
duration: videoInfo.duration,
width: videoInfo.width,
height: videoInfo.height,
}
resolve(result as any)
},
fail: errorCallback,
})
function successCallback(tempFilePath: string) {
plus.io.getVideoInfo({
filePath: tempFilePath,
success(videoInfo) {
const result = {
errMsg: 'chooseVideo:ok',
tempFilePath: tempFilePath,
size: videoInfo.size,
duration: videoInfo.duration,
width: videoInfo.width,
height: videoInfo.height,
}
// @ts-expect-error tempFile、name 仅H5支持
resolve(result)
},
fail: errorCallback,
})
}
function openAlbum() {
plus.gallery.pick(
// NOTE 5+此API分单选和多选,多选返回files:string[]
// @ts-ignore
// @ts-ignore 5+此API分单选和多选,多选返回files:string[]
({ files }) => successCallback(files[0]),
errorCallback,
{
......@@ -77,6 +48,8 @@ export const chooseVideo = defineAsyncApi<API_TYPE_CHOOSE_VIDEO>(
maximum: 1,
filename: TEMP_PATH + '/gallery/',
permissionAlert: true,
// @ts-expect-error 新增参数,用于视频压缩
videoCompress: compressed,
}
)
}
......@@ -87,6 +60,8 @@ export const chooseVideo = defineAsyncApi<API_TYPE_CHOOSE_VIDEO>(
index: camera === 'front' ? '2' : '1',
videoMaximumDuration: maxDuration,
filename: TEMP_PATH + '/camera/',
// @ts-expect-error 新增参数,用于视频压缩
videoCompress: compressed,
})
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册