eggjs / eggjs/egg

Reach filesize limit,egg-multipart上传失败以后,临时文件无法删除,会导致服务器占用存储空间越来越大

Open
#5,218 3 comments 0 reactions 0 assignees View on GitHub
Dominant language
TypeScript
Stars
19k
Forks
1.8k
PR merge metrics
No merged PRs in 30d

Description

### 在此输入你需要反馈的 Bug 具体信息(Bug in Detail):

通过egg-multipart上传的文件超过默认配置的大小限制,会抛出异常,但是无法删除上传失败的临时文件,上传的临时文件就是egg-mulipart配置的filesize大小,最终会导致服务器存储空间占满

上传文件抛出异常以后,catch中捕获的异常`requestFiles`是空数组

### 可复现问题的仓库地址(Reproduction Repo)

async saveRequestFiles(options = {}) {
const ctx = this;

const allowArrayField = ctx.app.config.multipart.allowArrayField;

let storedir;

const requestBody = {};
const requestFiles = [];

options.autoFields = false;
const parts = ctx.multipart(options);

try {
for await (const part of parts) {
if (Array.isArray(part)) {
// fields
const [ fieldName, fieldValue ] = part;
if (!allowArrayField) {
requestBody[fieldName] = fieldValue;
} else {
if (!requestBody[fieldName]) {
requestBody[fieldName] = fieldValue;
} else if (!Array.isArray(requestBody[fieldName])) {
requestBody[fieldName] = [ requestBody[fieldName], fieldValue ];
} else {
requestBody[fieldName].push(fieldValue);
}
}
} else {
// stream
const { filename, fieldname, encoding, mime } = part;

if (!storedir) {
// ${tmpdir}/YYYY/MM/DD/HH
storedir = path.join(ctx.app.config.multipart.tmpdir, dayjs().format('YYYY/MM/DD/HH'));
await fs.mkdir(storedir, { recursive: true });
}

// write to tmp file
const filepath = path.join(storedir, randomUUID() + path.extname(filename));
const target = createWriteStream(filepath);
await pipeline(part, target);

const meta = {
filepath,
field: fieldname,
filename,
encoding,
mime,
// keep same property name as file stream, https://github.com/cojs/busboy/blob/master/index.js#L114
fieldname,
transferEncoding: encoding,
mimeType: mime,
};

requestFiles.push(meta);
}
}
} catch (err) {
await ctx.cleanupRequestFiles(requestFiles);
throw err;
}

ctx.request.body = requestBody;
ctx.request.files = requestFiles;
},

### Node 版本号:

v14.21.3

### Eggjs 版本号:

3.3.3

### 相关插件名称与版本号(PlugIn and Name):

egg-multipart 3.3.0

### 操作平台与版本号(Platform and Version):

linux

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.