feat(upload): compress images over 10MB before OSS upload (v3.4.13)
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,34 @@
|
||||
import Taro from '@tarojs/taro';
|
||||
|
||||
const MAX_BYTES = 10 * 1024 * 1024;
|
||||
|
||||
/** 小程序临时文件超过 10MB 时用 compressImage 压缩后再上传 */
|
||||
export async function compressWeappImageIfNeeded(tempFilePath: string): Promise<string> {
|
||||
if (process.env.TARO_ENV !== 'weapp') return tempFilePath;
|
||||
|
||||
let path = tempFilePath;
|
||||
let size = await getFileSize(path);
|
||||
if (size <= MAX_BYTES) return path;
|
||||
|
||||
const qualities = [80, 65, 50, 40];
|
||||
for (const quality of qualities) {
|
||||
const res = await Taro.compressImage({ src: path, quality });
|
||||
path = res.tempFilePath;
|
||||
size = await getFileSize(path);
|
||||
if (size <= MAX_BYTES) return path;
|
||||
}
|
||||
|
||||
if (size > MAX_BYTES) {
|
||||
throw new Error('图片压缩后仍超过 10MB,请换一张较小的图片');
|
||||
}
|
||||
return path;
|
||||
}
|
||||
|
||||
async function getFileSize(filePath: string): Promise<number> {
|
||||
try {
|
||||
const info = await Taro.getFileInfo({ filePath });
|
||||
return typeof info.size === 'number' ? info.size : 0;
|
||||
} catch {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@@ -69,12 +69,15 @@ export function mergeWxDisplayProfile(profile: UserProfile): UserProfile {
|
||||
/** 上传 chooseAvatar 临时文件到 OSS,并返回已登记到当前用户的真实资源。 */
|
||||
export async function uploadAvatarTempFile(tempFilePath: string): Promise<UploadedAvatarResource> {
|
||||
const { API_BASE, CLIENT_APP, getToken } = await import('./api');
|
||||
const { compressWeappImageIfNeeded } = await import('./compress-image');
|
||||
const token = getToken();
|
||||
if (!token) throw new Error('请先登录');
|
||||
|
||||
const filePath = await compressWeappImageIfNeeded(tempFilePath);
|
||||
|
||||
const res = await Taro.uploadFile({
|
||||
url: `${API_BASE}/common/resources/upload`,
|
||||
filePath: tempFilePath,
|
||||
filePath,
|
||||
name: 'file',
|
||||
formData: {
|
||||
bizType: 'AVATAR',
|
||||
|
||||
Reference in New Issue
Block a user