duidui_mini_program/pages/camp_task_subjective_question/modules/image-handler.js
2026-03-27 10:41:46 +08:00

115 lines
2.8 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 图片处理模块
* 负责图片选择、上传、删除等操作
*/
import oss from '../../../utils/oss.js';
/**
* 选择图片
* @param {Number} maxCount - 最大数量
* @param {Number} currentCount - 当前数量
* @returns {Promise} 选择的图片路径数组
*/
export function chooseImage(maxCount = 6, currentCount = 0) {
const remainCount = maxCount - currentCount;
if (remainCount <= 0) {
wx.showToast({
title: `最多只能上传${maxCount}张图片`,
icon: 'none'
});
return Promise.resolve([]);
}
return new Promise((resolve, reject) => {
wx.chooseMedia({
count: remainCount,
mediaType: ['image'],
sizeType: ['compressed'],
sourceType: ['album', 'camera'],
success: function(res) {
const newImages = res.tempFiles.map(function(file) {
return file.tempFilePath;
});
resolve(newImages);
},
fail: function(err) {
reject(err);
}
});
});
}
/**
* 上传图片到 OSS
* @param {String} tempFilePath - 临时文件路径
* @param {String} taskId - 任务ID
* @param {String} subDir - 子目录(如 'subjective', 'essay'
* @returns {Promise} 上传后的图片URL
*/
export function uploadImage(tempFilePath, taskId, subDir = 'subjective') {
return new Promise(function(resolve, reject) {
(async function(){
try {
var cfg = await oss.getOssConfig('camp');
if (!cfg) return reject(new Error('无法获取上传凭证'));
var ext = 'jpg';
if (/(\.png)$/i.test(tempFilePath)) ext = 'png';
else if (/(\.jpeg)$/i.test(tempFilePath)) ext = 'jpeg';
else if (/(\.webp)$/i.test(tempFilePath)) ext = 'webp';
var key = oss.buildOssKey({
baseDir: cfg.dir || 'camp',
subDir: subDir,
userId: wx.getStorageSync('wxuserid') || 'anonymous',
taskId: taskId || 'unknown',
ext: ext
});
wx.uploadFile({
url: cfg.host,
filePath: tempFilePath,
name: 'file',
formData: {
key: key,
policy: cfg.policy,
'x-oss-signature': cfg.signature,
'x-oss-signature-version': cfg.signatureVersion,
'x-oss-credential': cfg.credential,
'x-oss-date': cfg.date,
'x-oss-security-token': cfg.securityToken,
success_action_status: '200'
},
success: function(res){
if (res.statusCode === 204 || res.statusCode === 200) {
var url = cfg.host.replace(/\/$/, '') + '/' + key;
resolve(url);
} else {
reject(new Error('oss_upload_failed'));
}
},
fail: function(err){ reject(err); }
});
} catch (e) { reject(e); }
})();
});
}
/**
* 预览图片
* @param {String} current - 当前图片URL
* @param {Array} urls - 所有图片URL数组
*/
export function previewImage(current, urls) {
if (!current || !urls || urls.length === 0) {
return;
}
wx.previewImage({
current: current,
urls: urls
});
}