You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

107 lines
2.1 KiB
TypeScript

import CryptoJS from 'crypto-js';
import mime from 'mime';
import { ImgInfo } from './types';
class FileNameGenerator {
date: Date;
info: ImgInfo;
static fields = [
'year',
'month',
'day',
'fullName',
'fileName',
'extName',
'timestamp',
'timestampMS',
'md5',
];
constructor(info: ImgInfo) {
this.date = new Date();
this.info = info;
}
public year(): string {
return `${this.date.getFullYear()}`;
}
public month(): string {
return this.date.getMonth() < 9
? `0${this.date.getMonth() + 1}`
: `${this.date.getMonth() + 1}`;
}
public day(): string {
return this.date.getDate() < 9 ? `0${this.date.getDate()}` : `${this.date.getDate()}`;
}
public fullName(): string {
return this.info.fileName;
}
public fileName(): string {
return this.info.fileName.replace(this.info.extname, '');
}
public extName(): string {
return this.info.extname.replace('.', '');
}
public timestamp(): string {
return Math.floor(Date.now() / 1000).toString();
}
public timestampMS(): string {
return Date.now().toString();
}
public md5(): string {
const wordArray = CryptoJS.lib.WordArray.create(this.imgBuffer());
const md5Hash = CryptoJS.MD5(wordArray);
return md5Hash.toString(CryptoJS.enc.Hex);
}
private imgBuffer(): Buffer {
return this.info.buffer;
}
}
export function formatPath(info: ImgInfo, format?: string): string {
if (!format) {
return info.fileName;
}
const fileNameGenerator = new FileNameGenerator(info);
let formatPath: string = format;
for (const key of FileNameGenerator.fields) {
const re = new RegExp(`{${key}}`, 'g');
// @ts-ignore
formatPath = formatPath.replace(re, fileNameGenerator[key]());
}
return formatPath;
}
export async function extractInfo(info: ImgInfo): Promise<{
body?: Buffer;
contentEncoding?: string;
contentType?: string;
}> {
const result: {
body?: Buffer;
contentEncoding?: string;
contentType?: string;
} = {};
if (info.extname) {
result.contentType = mime.getType(info.extname) as string;
}
result.body = info.buffer;
return result;
}