103 lines
3.6 KiB
JavaScript
103 lines
3.6 KiB
JavaScript
// 阿里云直传工具
|
||
import apiConfig from '../config/api_config.js';
|
||
import request from './request.js';
|
||
|
||
function requestOssSignature(dir) {
|
||
// 使用 Fiber 后端的接口
|
||
const dirParam = dir || 'camp';
|
||
return request({
|
||
url: `/oss/upload/signature?dir=${encodeURIComponent(dirParam)}`,
|
||
method: 'GET'
|
||
}).then(function(res) {
|
||
// Fiber 后端直接返回凭证数据(JSON格式),兼容可能的包裹格式
|
||
// 如果返回 { success: true, data: {...} },则提取 data;否则直接使用 res
|
||
if (res && res.success === true && res.data) {
|
||
return res.data;
|
||
}
|
||
// 直接返回数据(Fiber 后端直接返回 PolicyToken 结构)
|
||
return res;
|
||
}).catch(function(err) {
|
||
console.error('获取OSS上传凭证失败:', err);
|
||
return null;
|
||
});
|
||
}
|
||
|
||
function normalizeSignature(raw) {
|
||
if (!raw) return null;
|
||
// Fiber 后端直接返回凭证数据,兼容旧格式 { success, data } 或直接返回
|
||
var data = raw.data || raw;
|
||
// 常见字段名兼容
|
||
var host = data.host || data.endpoint || '';
|
||
var dir = data.dir || data.prefix || '';
|
||
var policy = data.policy;
|
||
var signature = data.signature;
|
||
|
||
// v4 字段(表单直传)- Fiber 后端使用这些字段名
|
||
var sigVer = data.x_oss_signature_version || data['x-oss-signature-version'] || data.signature_version || data.SignatureVersion;
|
||
var credential = data.x_oss_credential || data['x-oss-credential'] || data.credential || data.Credential;
|
||
var date = data.x_oss_date || data['x-oss-date'] || data.date || data.Date;
|
||
var securityToken = data.security_token || data['x-oss-security-token'] || data.SecurityToken || data.securityToken;
|
||
|
||
// v2 兼容字段(旧接口可能使用)
|
||
var accessId = data.accessid || data.accessKeyId || data.OSSAccessKeyId || data.accessId;
|
||
|
||
if (!host || !policy || !signature) return null;
|
||
|
||
// Fiber 后端使用 v4 签名,返回 v4 所需字段
|
||
if (sigVer) {
|
||
return {
|
||
host: host,
|
||
dir: dir,
|
||
policy: policy,
|
||
signature: signature,
|
||
signatureVersion: sigVer,
|
||
credential: credential,
|
||
date: date,
|
||
securityToken: securityToken
|
||
};
|
||
}
|
||
|
||
// v2 兼容(旧接口)
|
||
if (!accessId) return null;
|
||
return { host: host, dir: dir, accessId: accessId, policy: policy, signature: signature };
|
||
}
|
||
|
||
function buildOssKey(options) {
|
||
var now = new Date();
|
||
function pad(n){ return n < 10 ? ('0'+n) : ''+n; }
|
||
var y = now.getFullYear();
|
||
var m = pad(now.getMonth()+1);
|
||
var d = pad(now.getDate());
|
||
var h = pad(now.getHours());
|
||
var mm = pad(now.getMinutes());
|
||
var s = pad(now.getSeconds());
|
||
var ts = now.getTime();
|
||
|
||
var userId = String(options.userId || 'anonymous');
|
||
var taskId = String(options.taskId || 'unknown');
|
||
var baseDir = options.baseDir || 'camp';
|
||
var subDir = options.subDir || 'subjective';
|
||
var ext = options.ext || 'jpg';
|
||
|
||
return [
|
||
baseDir,
|
||
'user_'+userId,
|
||
subDir,
|
||
taskId,
|
||
''+y+m+d,
|
||
ts+'_'+Math.floor(Math.random()*100000)+'.'+ext
|
||
].join('/');
|
||
}
|
||
|
||
async function getOssConfig(dir) {
|
||
var raw = await requestOssSignature(dir || 'camp');
|
||
return normalizeSignature(raw);
|
||
}
|
||
|
||
module.exports = {
|
||
getOssConfig,
|
||
buildOssKey
|
||
};
|
||
|
||
|