stt / src /controllers /fileController.ts
yuanjiajun
feat: 文件服务
b4cb9df
import * as fs from 'fs';
import * as path from 'path';
import { Context } from 'koa';
const UPLOAD_DIR = path.join(__dirname, '../../uploads');
export const getFileNameList = async (ctx: Context) => {
try {
const files = fs.readdirSync(UPLOAD_DIR);
ctx.body = { files };
} catch (error: any) {
ctx.status = 500;
ctx.body = { error: error.message };
}
};
export const uploadFile = async (ctx: Context) => {
try {
if (!ctx.request.body || !ctx.request.header['content-disposition']) {
ctx.status = 400;
ctx.body = { error: 'No file or file name uploaded' };
return;
}
const fileBuffer = ctx.request.body;
const contentDisposition = ctx.request.header['content-disposition'];
const fileNameMatch = contentDisposition.match(/filename=(.+)/);
if (!fileNameMatch) {
ctx.status = 400;
ctx.body = { error: 'File name not found in Content-Disposition header' };
return;
}
const fileName = fileNameMatch[1];
const targetPath = path.join(UPLOAD_DIR, fileName);
fs.writeFileSync(targetPath, fileBuffer);
ctx.body = { message: 'File uploaded successfully' };
} catch (error: any) {
ctx.status = 500;
ctx.body = { error: error.message };
}
};
export const getFile = async (ctx: Context) => {
try {
const fileName = ctx.params.fileName;
const filePath = path.join(UPLOAD_DIR, fileName);
if (!fs.existsSync(filePath)) {
ctx.status = 404;
ctx.body = { error: 'File not found' };
return;
}
ctx.attachment(fileName);
ctx.body = fs.createReadStream(filePath);
} catch (error: any) {
ctx.status = 500;
ctx.body = { error: error.message };
}
};
export const deleteFile = async (ctx: Context) => {
try {
const { fileName } = ctx.request.body;
if (!fileName) {
ctx.status = 400;
ctx.body = { error: 'File name is required' };
return;
}
const filePath = path.join(UPLOAD_DIR, fileName);
if (!fs.existsSync(filePath)) {
ctx.status = 404;
ctx.body = { error: 'File not found' };
return;
}
fs.unlinkSync(filePath);
ctx.body = { message: 'File deleted successfully' };
} catch (error: any) {
ctx.status = 500;
ctx.body = { error: error.message };
}
};