mirror of
https://github.com/infiniflow/ragflow.git
synced 2025-12-24 15:36:50 +08:00
### What problem does this PR solve? Feat: Add the SelectWithSearch component #3221 ### Type of change - [x] New Feature (non-breaking change which adds functionality)
184 lines
4.6 KiB
TypeScript
184 lines
4.6 KiB
TypeScript
import { FileMimeType } from '@/constants/common';
|
|
import fileManagerService from '@/services/file-manager-service';
|
|
import { UploadFile } from 'antd';
|
|
|
|
export const transformFile2Base64 = (val: any): Promise<any> => {
|
|
return new Promise((resolve, reject) => {
|
|
const reader = new FileReader();
|
|
reader.readAsDataURL(val);
|
|
reader.onload = (): void => {
|
|
// Create image object
|
|
const img = new Image();
|
|
img.src = reader.result as string;
|
|
|
|
img.onload = () => {
|
|
// Create canvas
|
|
const canvas = document.createElement('canvas');
|
|
const ctx = canvas.getContext('2d');
|
|
|
|
// Calculate compressed dimensions, set max width/height to 800px
|
|
let width = img.width;
|
|
let height = img.height;
|
|
const maxSize = 100;
|
|
|
|
if (width > height && width > maxSize) {
|
|
height = (height * maxSize) / width;
|
|
width = maxSize;
|
|
} else if (height > maxSize) {
|
|
width = (width * maxSize) / height;
|
|
height = maxSize;
|
|
}
|
|
|
|
// Set canvas dimensions
|
|
canvas.width = width;
|
|
canvas.height = height;
|
|
|
|
// Draw image
|
|
ctx?.drawImage(img, 0, 0, width, height);
|
|
|
|
// Convert to base64, maintain original format and transparency
|
|
const compressedBase64 = canvas.toDataURL('image/png');
|
|
resolve(compressedBase64);
|
|
};
|
|
|
|
img.onerror = reject;
|
|
};
|
|
reader.onerror = reject;
|
|
});
|
|
};
|
|
|
|
export const transformBase64ToFile = (
|
|
dataUrl: string,
|
|
filename: string = 'file',
|
|
) => {
|
|
let arr = dataUrl.split(','),
|
|
bstr = atob(arr[1]),
|
|
n = bstr.length,
|
|
u8arr = new Uint8Array(n);
|
|
|
|
const mime = arr[0].match(/:(.*?);/);
|
|
const mimeType = mime ? mime[1] : 'image/png';
|
|
|
|
while (n--) {
|
|
u8arr[n] = bstr.charCodeAt(n);
|
|
}
|
|
return new File([u8arr], filename, { type: mimeType });
|
|
};
|
|
|
|
export const normFile = (e: any) => {
|
|
if (Array.isArray(e)) {
|
|
return e;
|
|
}
|
|
return e?.fileList;
|
|
};
|
|
|
|
export const getUploadFileListFromBase64 = (avatar: string) => {
|
|
let fileList: UploadFile[] = [];
|
|
|
|
if (avatar) {
|
|
fileList = [{ uid: '1', name: 'file', thumbUrl: avatar, status: 'done' }];
|
|
}
|
|
|
|
return fileList;
|
|
};
|
|
|
|
export const getBase64FromUploadFileList = async (fileList?: UploadFile[]) => {
|
|
if (Array.isArray(fileList) && fileList.length > 0) {
|
|
const file = fileList[0];
|
|
const originFileObj = file.originFileObj;
|
|
if (originFileObj) {
|
|
const base64 = await transformFile2Base64(originFileObj);
|
|
return base64;
|
|
} else {
|
|
return file.thumbUrl;
|
|
}
|
|
// return fileList[0].thumbUrl; TODO: Even JPG files will be converted to base64 parameters in png format
|
|
}
|
|
|
|
return '';
|
|
};
|
|
|
|
async function fetchDocumentBlob(id: string, mimeType?: FileMimeType) {
|
|
const response = await fileManagerService.getDocumentFile({}, id);
|
|
const blob = new Blob([response.data], {
|
|
type: mimeType || response.data.type,
|
|
});
|
|
|
|
return blob;
|
|
}
|
|
|
|
export async function previewHtmlFile(id: string) {
|
|
const blob = await fetchDocumentBlob(id, FileMimeType.Html);
|
|
const url = URL.createObjectURL(blob);
|
|
const link = document.createElement('a');
|
|
link.href = url;
|
|
link.click();
|
|
URL.revokeObjectURL(url);
|
|
}
|
|
|
|
export const downloadFileFromBlob = (blob: Blob, name?: string) => {
|
|
const url = window.URL.createObjectURL(blob);
|
|
const a = document.createElement('a');
|
|
a.href = url;
|
|
if (name) {
|
|
a.download = name;
|
|
}
|
|
a.click();
|
|
window.URL.revokeObjectURL(url);
|
|
};
|
|
|
|
export const downloadDocument = async ({
|
|
id,
|
|
filename,
|
|
}: {
|
|
id: string;
|
|
filename?: string;
|
|
}) => {
|
|
const blob = await fetchDocumentBlob(id);
|
|
downloadFileFromBlob(blob, filename);
|
|
};
|
|
|
|
const Units = ['bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
|
|
|
|
export const formatBytes = (x: string | number) => {
|
|
let l = 0,
|
|
n = (typeof x === 'string' ? parseInt(x, 10) : x) || 0;
|
|
|
|
while (n >= 1024 && ++l) {
|
|
n = n / 1024;
|
|
}
|
|
|
|
return n.toFixed(n < 10 && l > 0 ? 1 : 0) + ' ' + Units[l];
|
|
};
|
|
|
|
export const downloadJsonFile = async (
|
|
data: Record<string, any>,
|
|
fileName: string,
|
|
) => {
|
|
const blob = new Blob([JSON.stringify(data)], { type: FileMimeType.Json });
|
|
downloadFileFromBlob(blob, fileName);
|
|
};
|
|
|
|
export function transformBase64ToFileWithPreview(
|
|
dataUrl: string,
|
|
filename: string = 'file',
|
|
) {
|
|
const file = transformBase64ToFile(dataUrl, filename);
|
|
|
|
(file as any).preview = dataUrl;
|
|
|
|
return file;
|
|
}
|
|
|
|
export const getBase64FromFileList = async (fileList?: File[]) => {
|
|
if (Array.isArray(fileList) && fileList.length > 0) {
|
|
const file = fileList[0];
|
|
if (file) {
|
|
const base64 = await transformFile2Base64(file);
|
|
return base64;
|
|
}
|
|
}
|
|
|
|
return '';
|
|
};
|