chore: image edit ux

This commit is contained in:
jialin
2024-12-27 14:56:06 +08:00
parent 91c5e7e06c
commit 542f048a67
17 changed files with 1198 additions and 206 deletions
+56 -1
View File
@@ -1,5 +1,4 @@
import qs from 'query-string';
const extractStreamRegx = /data:\s*({.*?})(?=\n|$)/g;
const extractJSON = (dataStr: string) => {
@@ -68,6 +67,62 @@ export const fetchChunkedData = async (params: {
};
};
const createFormData = (data: any): FormData => {
const formData = new FormData();
const appendToFormData = (key: string, value: any) => {
if (value instanceof File) {
// 处理文件类型
formData.append(key, value);
} else if (typeof value === 'object' && value !== null) {
// 如果是对象或数组,序列化为 JSON 字符串
formData.append(key, JSON.stringify(value));
} else {
// 处理基本数据类型
formData.append(key, String(value));
}
};
for (const key in data) {
if (Object.prototype.hasOwnProperty.call(data, key)) {
appendToFormData(key, data[key]);
}
}
return formData;
};
export const fetchChunkedDataPostFormData = async (params: {
data?: any;
url: string;
params?: any;
signal?: AbortSignal;
method?: string;
headers?: any;
}) => {
const { url } = params;
const response = await fetch(url, {
method: 'POST',
body: createFormData(params.data),
signal: params.signal
});
console.log('response====', response);
if (!response.ok) {
return {
error: true,
data: await response.json()
};
}
const reader = response?.body?.getReader();
const decoder = new TextDecoder('utf-8', {
fatal: true
});
return {
reader,
decoder
};
};
export const readStreamData = async (
reader: any,
decoder: TextDecoder,
+33
View File
@@ -140,3 +140,36 @@ export const generateRandomNumber = () => {
// 16: 0x100032:0x100000000
return Math.floor(Math.random() * 0x100000000);
};
function base64ToBlob(base64: string, contentType = '', sliceSize = 512) {
const byteCharacters = atob(base64.split(',')[1]); // 去掉 Base64 前缀部分
const byteArrays = [];
for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
const slice = byteCharacters.slice(offset, offset + sliceSize);
const byteNumbers = new Array(slice.length);
for (let i = 0; i < slice.length; i++) {
byteNumbers[i] = slice.charCodeAt(i);
}
const byteArray = new Uint8Array(byteNumbers);
byteArrays.push(byteArray);
}
return new Blob(byteArrays, { type: contentType });
}
export const base64ToFile = (base64String: string, fileName: string) => {
if (!base64String) {
return null;
}
console.log('base64String:', base64String);
const match = base64String.match(/data:(.*?);base64,/);
if (!match) {
throw new Error('Invalid base64 string');
}
const contentType = match[1];
const blob = base64ToBlob(base64String, contentType);
return new File([blob], fileName || contentType, { type: contentType });
};