it-tools/dist/server/chunks/chunk-cce4ae69.js
2024-04-28 00:48:29 +08:00

48 lines
1.5 KiB
JavaScript

import { extension } from 'mime-types';
import _ from 'lodash';
const commonMimeTypesSignatures = {
"JVBERi0": "application/pdf",
"R0lGODdh": "image/gif",
"R0lGODlh": "image/gif",
"iVBORw0KGgo": "image/png",
"/9j/": "image/jpg"
};
function getMimeTypeFromBase64({ base64String }) {
const [, mimeTypeFromBase64] = base64String.match(/data:(.*?);base64/i) ?? [];
if (mimeTypeFromBase64) {
return { mimeType: mimeTypeFromBase64 };
}
const inferredMimeType = _.find(commonMimeTypesSignatures, (_mimeType, signature) => base64String.startsWith(signature));
if (inferredMimeType) {
return { mimeType: inferredMimeType };
}
return { mimeType: void 0 };
}
function getFileExtensionFromMimeType({
mimeType,
defaultExtension = "txt"
}) {
if (mimeType) {
return extension(mimeType) ?? defaultExtension;
}
return defaultExtension;
}
function useDownloadFileFromBase64({ source, filename }) {
return {
download() {
if (source.value === "") {
throw new Error("Base64 string is empty");
}
const { mimeType } = getMimeTypeFromBase64({ base64String: source.value });
const base64String = mimeType ? source.value : `data:text/plain;base64,${source.value}`;
const cleanFileName = filename ?? `file.${getFileExtensionFromMimeType({ mimeType })}`;
const a = document.createElement("a");
a.href = base64String;
a.download = cleanFileName;
a.click();
}
};
}
export { useDownloadFileFromBase64 as u };