web
8 小时以前 49fa0d82a40345342966e810b44429aec0480ef3
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
// @ts-nocheck
 
// #ifdef APP-PLUS
import { getLocalFilePath } from '../getLocalFilePath'
// #endif
function isImage(extension : string) {
    const imageExtensions = ["jpg", "jpeg", "png", "gif", "bmp", "svg"];
    return imageExtensions.includes(extension.toLowerCase());
}
// #ifdef H5
function getSVGFromURL(url: string) {
    return new Promise((resolve, reject) => {
        const xhr = new XMLHttpRequest();
        xhr.open('GET', url, true);
        xhr.responseType = 'text';
 
        xhr.onload = function () {
            if (xhr.status === 200) {
                const svg = xhr.responseText;
                resolve(svg);
            } else {
                reject(new Error(xhr.statusText));
            }
        };
 
        xhr.onerror = function () {
            reject(new Error('Network error'));
        };
 
        xhr.send();
    });
}
// #endif
/**
 * 路径转base64
 * @param {Object} string
 */
export function pathToBase64(path : string) : Promise<string> {
    if (/^data:/.test(path)) return path
    let extension = path.substring(path.lastIndexOf('.') + 1);
    const isImageFile = isImage(extension)
    let prefix = ''
    if (isImageFile) {
        prefix = 'image/';
        if(extension == 'svg') {
            extension += '+xml'
        }
    } else if (extension === 'pdf') {
        prefix = 'application/pdf';
    } else if (extension === 'txt') {
        prefix = 'text/plain';
    } else {
        // 添加更多文件类型的判断
        // 如果不是图片、PDF、文本等类型,可以设定默认的前缀或采取其他处理
        prefix = 'application/octet-stream';
    }
    return new Promise((resolve, reject) => {
        // #ifdef H5
        if (isImageFile) {
            if(extension == 'svg') {
                getSVGFromURL(path).then(svg => {
                    const base64 = btoa(svg);
                    resolve(`data:image/svg+xml;base64,${base64}`);
                })
            } else {
                let image = new Image();
                image.setAttribute("crossOrigin", 'Anonymous');
                image.onload = function () {
                    let canvas = document.createElement('canvas');
                    canvas.width = this.naturalWidth;
                    canvas.height = this.naturalHeight;
                    canvas.getContext('2d').drawImage(image, 0, 0);
                    let result = canvas.toDataURL(`${prefix}${extension}`)
                    resolve(result);
                    canvas.height = canvas.width = 0
                }
                image.src = path + '?v=' + Math.random()
                image.onerror = (error) => {
                    reject(error);
                };
            }
            
        } else {
            reject('not image');
        }
 
        // #endif
 
        // #ifdef MP
        if (uni.canIUse('getFileSystemManager')) {
            uni.getFileSystemManager().readFile({
                filePath: path,
                encoding: 'base64',
                success: (res) => {
                    resolve(`data:${prefix}${extension};base64,${res.data}`)
                },
                fail: (error) => {
                    console.error({ error, path })
                    reject(error)
                }
            })
        }
        // #endif
 
        // #ifdef APP-PLUS
        plus.io.resolveLocalFileSystemURL(getLocalFilePath(path), (entry) => {
            entry.file((file : any) => {
                const fileReader = new plus.io.FileReader()
                fileReader.onload = (data) => {
                    resolve(data.target.result)
                }
                fileReader.onerror = (error) => {
                    console.error({ error, path })
                    reject(error)
                }
                fileReader.readAsDataURL(file)
            }, reject)
        }, reject)
        // #endif
    })
}