@shencom/oss-upload
Version:
code upload to oss
96 lines (86 loc) • 2.33 kB
text/typescript
import { existsSync, readFileSync } from 'fs';
import { extname } from 'path';
import glob from 'glob';
import minimatch from 'minimatch';
import type AliOSS from 'ali-oss';
import { md5 } from './utils';
export interface FileData {
url: string;
md5: string;
}
/**
* 验证oss路径
*
* @export
* @param {string} uploadPath 上传路径
* @param {string} baseOssPath 基础oss路径
* @returns
*/
export function isOssPath(uploadPath: string, baseOssPath: string) {
if (uploadPath === baseOssPath) return true;
const filePath = uploadPath.replace(baseOssPath, '');
return !!extname(filePath);
}
/**
* 文件流处理
*
* @param {string} filePath 文件路径
* @return {(null | FileData)}
*/
export function fileStreamHandle(filePath: string): null | FileData {
const isFiles = existsSync(filePath);
if (!isFiles) return null;
const stream = readFileSync(filePath);
return { url: filePath, md5: md5(stream) };
}
/**
* 过滤匹配上的列表数据
*
* @param {string[]} [list=[]]
* @param {string[]} [patterns=[]]
* @return {string[]}
*/
export function listIgnoreHandle(list: string[] = [], patterns: string[] = []): string[] {
patterns.forEach((pattern: string) => {
list = minimatch.match(list, `!${pattern}`, {
matchBase: true,
});
});
return list;
}
/**
* 获取目录下的所有文件路径,排除文件目录
*
* @param {string} dirPath
* @return {string[]}
*/
export function getDirFilesPath(dirPath: string, ops?: glob.IOptions): string[] {
const files = glob.sync(`${dirPath}/**`, { ...ops, nodir: true });
return files;
}
/**
* 获取目录下的一级文件路径,包括文件目录
*
* @param {string} dirPath
* @return {string[]}
*/
export function getDirRootFilesPath(dirPath: string, ops?: glob.IOptions): string[] {
const paths = glob.sync(`${dirPath}/*`, { ...ops, mark: true });
return paths;
}
/**
* 只保留oss的 name(oss存储路径) 字段
*
* @param {AliOSS.ObjectMeta[]} objects
* @return {string[]}
*/
export function filterOssName(objects: AliOSS.ObjectMeta[]): string[] {
const names = objects
.map((v) => {
const paths = v.name.split('/'); // 过滤 oss 文件夹
if (!paths[paths.length - 1]) return null;
return v.name;
})
.filter(Boolean) as string[];
return names;
}