wangzhibo
4 天以前 10595d8632f959d0954d1939243196f4eed02372
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
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,
    };
}