Skip to content

Commit f1253a1

Browse files
authored
fix: get file buffer and upload file to S3 (#6004)
1 parent ac1a07d commit f1253a1

File tree

2 files changed

+58
-38
lines changed
  • packages/service/common/file
  • projects/app/src/pages/api/core/dataset/collection/create

2 files changed

+58
-38
lines changed

packages/service/common/file/multer.ts

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export type FileType = {
1616
size: number;
1717
};
1818

19-
/*
19+
/*
2020
maxSize: File max size (MB)
2121
*/
2222
export const getUploadModel = ({ maxSize = 500 }: { maxSize?: number }) => {
@@ -146,6 +146,43 @@ export const getUploadModel = ({ maxSize = 500 }: { maxSize?: number }) => {
146146
});
147147
});
148148
}
149+
150+
uploaderMemory = multer({
151+
storage: multer.memoryStorage(),
152+
limits: {
153+
fileSize: maxSize
154+
}
155+
}).single('file');
156+
157+
async getFileBuffer(req: NextApiRequest, res: NextApiResponse) {
158+
return new Promise<{
159+
buffer: Buffer;
160+
originalname: string;
161+
encoding: string;
162+
mimetype: string;
163+
}>((resolve, reject) => {
164+
// @ts-ignore
165+
this.uploaderMemory(req, res, (error) => {
166+
if (error) {
167+
return reject(error);
168+
}
169+
170+
// @ts-ignore
171+
const file = req.file;
172+
173+
if (!file?.buffer) {
174+
return reject(new Error('File empty'));
175+
}
176+
177+
resolve({
178+
buffer: file.buffer,
179+
originalname: decodeURIComponent(file.originalname),
180+
encoding: file.encoding,
181+
mimetype: file.mimetype
182+
});
183+
});
184+
});
185+
}
149186
}
150187

151188
return new UploadModel();

projects/app/src/pages/api/core/dataset/collection/create/localFile.ts

Lines changed: 20 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,26 @@
11
import type { NextApiRequest, NextApiResponse } from 'next';
2-
import { uploadFile } from '@fastgpt/service/common/file/gridfs/controller';
32
import { getUploadModel } from '@fastgpt/service/common/file/multer';
43
import { authDataset } from '@fastgpt/service/support/permission/dataset/auth';
54
import { type FileCreateDatasetCollectionParams } from '@fastgpt/global/core/dataset/api';
6-
import { removeFilesByPaths } from '@fastgpt/service/common/file/utils';
75
import { createCollectionAndInsertData } from '@fastgpt/service/core/dataset/collection/controller';
86
import { DatasetCollectionTypeEnum } from '@fastgpt/global/core/dataset/constants';
9-
import { getNanoid } from '@fastgpt/global/common/string/tools';
10-
import { BucketNameEnum } from '@fastgpt/global/common/file/constants';
117
import { NextAPI } from '@/service/middleware/entry';
128
import { WritePermissionVal } from '@fastgpt/global/support/permission/constant';
139
import { type CreateCollectionResponse } from '@/global/core/dataset/api';
10+
import { getS3DatasetSource } from '@fastgpt/service/common/s3/sources/dataset';
11+
import { removeS3TTL } from '@fastgpt/service/common/s3/utils';
1412

1513
async function handler(req: NextApiRequest, res: NextApiResponse<any>): CreateCollectionResponse {
16-
let filePaths: string[] = [];
17-
1814
try {
19-
// Create multer uploader
20-
const upload = getUploadModel({
21-
maxSize: global.feConfigs?.uploadFileMaxSize
22-
});
23-
const { file, data, bucketName } =
24-
await upload.getUploadFile<FileCreateDatasetCollectionParams>(
25-
req,
26-
res,
27-
BucketNameEnum.dataset
28-
);
29-
filePaths = [file.path];
30-
31-
if (!file || !bucketName) {
32-
throw new Error('file is empty');
33-
}
15+
const upload = getUploadModel({ maxSize: global.feConfigs?.uploadFileMaxSize });
16+
const { buffer, originalname } = await upload.getFileBuffer(req, res);
17+
const data = (() => {
18+
try {
19+
return JSON.parse(req.body?.data || '{}');
20+
} catch (error) {
21+
return {};
22+
}
23+
})() as FileCreateDatasetCollectionParams;
3424

3525
const { teamId, tmbId, dataset } = await authDataset({
3626
req,
@@ -40,29 +30,24 @@ async function handler(req: NextApiRequest, res: NextApiResponse<any>): CreateCo
4030
datasetId: data.datasetId
4131
});
4232

43-
const { fileMetadata, collectionMetadata, ...collectionData } = data;
44-
const collectionName = file.originalname;
33+
const s3DatasetSource = getS3DatasetSource();
4534

46-
// 1. upload file
47-
const fileId = await uploadFile({
48-
teamId,
49-
uid: tmbId,
50-
bucketName,
51-
path: file.path,
52-
filename: file.originalname,
53-
contentType: file.mimetype,
54-
metadata: fileMetadata
35+
const fileId = await s3DatasetSource.uploadDatasetFileByBuffer({
36+
datasetId: String(dataset._id),
37+
buffer,
38+
filename: originalname
5539
});
5640

57-
// 2. delete tmp file
58-
removeFilesByPaths(filePaths);
41+
await removeS3TTL({ key: fileId, bucketName: 'private' });
42+
43+
const { fileMetadata, collectionMetadata, ...collectionData } = data;
5944

6045
// 3. Create collection
6146
const { collectionId, insertResults } = await createCollectionAndInsertData({
6247
dataset,
6348
createCollectionParams: {
6449
...collectionData,
65-
name: collectionName,
50+
name: originalname,
6651
teamId,
6752
tmbId,
6853
type: DatasetCollectionTypeEnum.file,
@@ -76,8 +61,6 @@ async function handler(req: NextApiRequest, res: NextApiResponse<any>): CreateCo
7661

7762
return { collectionId, results: insertResults };
7863
} catch (error) {
79-
removeFilesByPaths(filePaths);
80-
8164
return Promise.reject(error);
8265
}
8366
}

0 commit comments

Comments
 (0)