cxc-szcx-uniapp/uni_modules/lime-shared/pathToBase64/vue.ts
2025-01-17 16:00:43 +08:00

121 lines
3.0 KiB
TypeScript
Raw 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.

// @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
})
}