nodejs 保存上传文件

nodejs 保存上传文件

我用的是thinkjs搭建的项目。 功能实现是一样的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import {think} from "thinkjs";
import fs from 'fs';
import * as path from 'path';

/**
* 保存文件
* @param filename // 文件名
* @param tempPath // 上传的临时文件路径
* @param base64 // base64 字符串
* @param prefix - 文件夹前缀
*/
export async function saveFile(filename: string, tempPath: string, base64?: string, prefix: string = 'static/upload') {
// 将 fs.rename promise 化
const renameFile = think.promisify(fs.rename, fs);
// 文件保存目录
const savePath = think.config('UPLOAD_PATH');
// 创建文件夹 // fs.mkdir
think.mkdir(savePath);
// 文件后缀
const suffix = filename.split('.').pop();

// 对文件名进行过滤
const name = filename.split('.').shift().replace(/[\s\\\/,.*@#$%^&\|""“”::]/gi, '');
const newname = `${name}_${Date.now()}.${suffix}`;
// 如果是base64 文件的话 进行转buffer保存
if (base64) {
base64 = base64.replace(/^data:\w+\/\w+;base64,/, '');
const buffer = new Buffer(base64, 'base64');
fs.writeFileSync(path.join(savePath, newname), buffer);
} else {
// 直接移动文件保存
await renameFile(tempPath, path.join(savePath, newname));
}
// 返回文件资源链接
return `${think.config('BASE_URL')}/${prefix}/${newname}`;
}