automated_uniapp/cool/upload/index.ts
2025-01-09 16:16:11 +08:00

142 lines
2.8 KiB
TypeScript

import dayjs from "dayjs";
import { config } from "../../config";
import { service } from "../service";
import { basename, pathJoin, uuid } from "../utils";
import { useStore } from "../store";
import { videoPoster, resizeImage } from "./comm";
declare interface UploadCallback {
onProgressUpdate?(options: UniApp.OnProgressUpdateResult): void;
onTask?(task: UniApp.UploadTask): void;
}
export async function upload(file: any, cb?: UploadCallback): Promise<string> {
const { onProgressUpdate, onTask } = cb || {};
// 获取上传模式
const { mode, type } = await service.base.comm.uploadMode();
// 用户缓存
const { user } = useStore();
// 本地上传
const isLocal = mode == "local";
// 文件名
const fileName = uuid() + "_" + (file.name || basename(file.path));
// Key
const key = isLocal ? fileName : pathJoin("app", dayjs().format("YYYY-MM-DD"), fileName);
// 多种上传请求
return new Promise((resolve, reject) => {
// 上传文件
function next({ host, preview, data }: { host: string; preview?: string; data?: any }) {
// 签名数据
const fd = {
...data,
key,
};
// 上传
const task = uni.uploadFile({
url: host,
filePath: file.path,
name: "file",
header: isLocal
? {
Authorization: user.token,
}
: {},
formData: fd,
success(res) {
if (isLocal) {
const { code, data, message } = JSON.parse(res.data);
if (code == 1000) {
resolve(data);
} else {
reject(message);
}
} else {
resolve(pathJoin(preview || host, fd.key));
}
},
fail(err) {
reject(err);
},
});
if (onTask) {
onTask(task);
}
if (onProgressUpdate) {
task.onProgressUpdate(onProgressUpdate);
}
}
if (isLocal) {
next({
host: config.baseUrl + "/app/base/comm/upload",
});
} else {
service.base.comm
.upload(
type == "aws"
? {
key,
}
: {}
)
.then((res) => {
switch (type) {
// 腾讯
case "cos":
next({
host: res.url,
data: res.credentials,
});
break;
// 阿里
case "oss":
next({
host: res.host,
data: {
OSSAccessKeyId: res.OSSAccessKeyId,
policy: res.policy,
signature: res.signature,
},
});
break;
// 七牛
case "qiniu":
next({
host: res.uploadUrl,
preview: res.publicDomain,
data: {
token: res.token,
},
});
break;
// aws
case "aws":
next({
host: res.url,
data: res.fields,
});
break;
}
})
.catch(reject);
}
});
}
export function useUpload() {
return {
upload,
videoPoster,
resizeImage,
};
}