Skip to content

Commit 6c811ce

Browse files
committed
增加上传成功后删除临时文件的逻辑以及回退一些修改
1 parent 869ba22 commit 6c811ce

File tree

5 files changed

+81
-68
lines changed

5 files changed

+81
-68
lines changed

projects/app/src/components/core/chat/ChatContainer/ChatBox/components/QuoteList.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,9 @@ const QuoteList = React.memo(function QuoteList({
5656
const currentFilterItem = quoteList.find((res) => res._id === item.id);
5757
return {
5858
...item,
59-
q: currentFilterItem?.q || item.q,
60-
a: currentFilterItem?.a || item.a,
61-
imageId: currentFilterItem?.imageId || item.imageId
59+
q: currentFilterItem?.q || '',
60+
a: currentFilterItem?.a || '',
61+
imageId: currentFilterItem?.imageId || item.imageId || ''
6262
};
6363
}
6464

projects/app/src/pageComponents/dataset/detail/DataCard.tsx

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -169,25 +169,27 @@ const DataCard = () => {
169169
<TagsPopOver currentCollection={collection} />
170170
)}
171171
</Box>
172-
{datasetDetail.type !== 'websiteDataset' && !!collection?.chunkSize && (
173-
<Button
174-
ml={2}
175-
variant={'whitePrimary'}
176-
size={['sm', 'md']}
177-
onClick={() => {
178-
router.push({
179-
query: {
180-
datasetId,
181-
currentTab: TabEnum.import,
182-
source: ImportDataSourceEnum.reTraining,
183-
collectionId
184-
}
185-
});
186-
}}
187-
>
188-
{t('dataset:retain_collection')}
189-
</Button>
190-
)}
172+
{datasetDetail.type !== 'websiteDataset' &&
173+
!!collection?.chunkSize &&
174+
collection.permission?.hasWritePer && (
175+
<Button
176+
ml={2}
177+
variant={'whitePrimary'}
178+
size={['sm', 'md']}
179+
onClick={() => {
180+
router.push({
181+
query: {
182+
datasetId,
183+
currentTab: TabEnum.import,
184+
source: ImportDataSourceEnum.reTraining,
185+
collectionId
186+
}
187+
});
188+
}}
189+
>
190+
{t('dataset:retain_collection')}
191+
</Button>
192+
)}
191193
{canWrite && (
192194
<Button
193195
ml={2}

projects/app/src/pageComponents/dataset/detail/MetaDataCard.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ const MetaDataCard = ({ datasetId }: { datasetId: string }) => {
9292
}
9393
]
9494
: []),
95-
...(collection.autoIndexes !== undefined && !isImageCollection
95+
...(collection.autoIndexes !== undefined
9696
? [
9797
{
9898
label: t('dataset:auto_indexes'),

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

Lines changed: 43 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { authDataset } from '@fastgpt/service/support/permission/dataset/auth';
2-
import { type FileIdCreateDatasetCollectionParams } from '@fastgpt/global/core/dataset/api';
2+
import { type CreateDatasetCollectionParams } from '@fastgpt/global/core/dataset/api';
33
import { createCollectionAndInsertData } from '@fastgpt/service/core/dataset/collection/controller';
44
import {
55
DatasetCollectionTypeEnum,
@@ -8,32 +8,22 @@ import {
88
import { NextAPI } from '@/service/middleware/entry';
99
import { type ApiRequestProps } from '@fastgpt/service/type/next';
1010
import { WritePermissionVal } from '@fastgpt/global/support/permission/constant';
11-
import { type CreateCollectionResponse } from '@/global/core/dataset/api';
1211
import { getDatasetImage } from '@fastgpt/service/core/dataset/image/controller';
1312
import { getVlmModelList } from '@fastgpt/service/core/ai/model';
13+
import { removeFilesByPaths } from '@fastgpt/service/common/file/utils';
1414

15-
async function handler(
16-
req: ApiRequestProps<
17-
FileIdCreateDatasetCollectionParams & {
18-
collectionName: string;
19-
metadata?: Record<string, any>;
20-
imageIds?: string[];
21-
}
22-
>
23-
): CreateCollectionResponse {
15+
type RequestBody = {
16+
datasetId: string;
17+
collectionName: string;
18+
imageIds: string[];
19+
};
20+
21+
async function handler(req: ApiRequestProps<RequestBody>) {
2422
if (getVlmModelList().length === 0) {
2523
throw new Error('Image_dataset_requires_VLM_model_to_be_configured');
2624
}
2725

28-
const { imageIds, collectionName, metadata, ...body } = req.body;
29-
30-
const { teamId, tmbId, dataset } = await authDataset({
31-
req,
32-
authToken: true,
33-
authApiKey: true,
34-
per: WritePermissionVal,
35-
datasetId: body.datasetId
36-
});
26+
const { imageIds, datasetId, collectionName } = req.body;
3727

3828
if (!imageIds || imageIds.length === 0) {
3929
throw new Error('No image IDs provided');
@@ -43,26 +33,45 @@ async function handler(
4333
throw new Error('Collection name is required');
4434
}
4535

46-
const { collectionId, insertResults } = await createCollectionAndInsertData({
47-
dataset,
36+
// Verify permissions
37+
const authData = await authDataset({
38+
datasetId,
39+
per: WritePermissionVal,
40+
req,
41+
authToken: true
42+
});
43+
44+
// Get all image paths before creating collection
45+
const filePaths: string[] = [];
46+
for (const imageId of imageIds) {
47+
const image = await getDatasetImage(imageId);
48+
if (image?.path) {
49+
filePaths.push(image.path);
50+
}
51+
}
52+
53+
// Create collection
54+
const result = await createCollectionAndInsertData({
55+
dataset: authData.dataset,
4856
createCollectionParams: {
49-
...body,
50-
teamId,
51-
tmbId,
52-
imageIdList: imageIds,
53-
trainingType: DatasetCollectionDataProcessModeEnum.imageParse,
54-
type: DatasetCollectionTypeEnum.images,
57+
teamId: authData.teamId,
58+
tmbId: authData.tmbId,
59+
datasetId,
5560
name: collectionName,
56-
metadata
61+
type: DatasetCollectionTypeEnum.images,
62+
trainingType: DatasetCollectionDataProcessModeEnum.imageParse,
63+
imageIdList: imageIds
5764
}
5865
});
5966

67+
// Delete temporary files after successful import
68+
if (filePaths.length > 0) {
69+
removeFilesByPaths(filePaths);
70+
}
71+
6072
return {
61-
collectionId: collectionId,
62-
results: {
63-
insertLen: insertResults.insertLen,
64-
message: insertResults.message
65-
}
73+
collectionId: result.collectionId,
74+
results: result.insertResults
6675
};
6776
}
6877

projects/app/src/pages/api/core/dataset/image/[imageId].ts

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,14 @@ import jwt from 'jsonwebtoken';
99

1010
const previewableExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp'];
1111

12+
interface VerifyImageTokenParams {
13+
token: string;
14+
imageId: string;
15+
req: NextApiRequest;
16+
}
17+
1218
// Verify dataset image access token
13-
const verifyImageToken = async (token: string, imageId: string, req: NextApiRequest) => {
19+
const verifyImageToken = async ({ token, imageId, req }: VerifyImageTokenParams) => {
1420
try {
1521
if (!process.env.FILE_TOKEN_KEY) {
1622
throw new Error('FILE_TOKEN_KEY not configured');
@@ -27,7 +33,7 @@ const verifyImageToken = async (token: string, imageId: string, req: NextApiRequ
2733
// Get image info for permission verification
2834
const imageInfo = await getDatasetImage(imageId);
2935
if (!imageInfo) {
30-
throw new Error('Image not found');
36+
return Promise.reject(new Error('Image not found'));
3137
}
3238

3339
// Verify dataset permissions
@@ -64,15 +70,11 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse<
6470
}
6571

6672
// Verify token and permissions
67-
const imageInfo = await verifyImageToken(token, imageId, req);
68-
69-
// Check if file exists
70-
if (!fs.existsSync(imageInfo.path)) {
71-
return jsonRes(res, {
72-
code: 500,
73-
error: 'Image file not found on disk'
74-
});
75-
}
73+
const imageInfo = await verifyImageToken({
74+
token,
75+
imageId,
76+
req
77+
});
7678

7779
// Get file extension
7880
const extension = path.extname(imageInfo.name).toLowerCase().slice(1);

0 commit comments

Comments
 (0)