我有一个应用程序,我想在其中存储多部分表单数据和图像。我希望图像存储在作为主 ID 的唯一文件夹中。我该怎么办。
这里我将多形式数据保存在数据库中。我想通过下面的函数使用主 ID 返回来创建文件夹来保存其各自的图像。
async createFaceDetection(faceDetectionReqDto: FaceDetectionReqDto): Promise<Object> {
try {
const newFaceDetection = new face_detection({
Name: faceDetectionReqDto.Name
})
const savedMediaUpload = await this.FaceDetectionRepository.save(newFaceDetection);
return savedMediaUpload
}
catch (err) {
throw err;
}
}
我如何使用由 multer 中的“savedMediaUpload”变量获取的主 ID
我的 component.controller.ts 代码
@UseInterceptors(
FilesInterceptor('Images', 20,
{
storage: diskStorage({
destination: async function (req, file, cb) {
const filePath = path.join(ROOT_DIR, FACE_DETECTION_PATH, {Primary-Id}) // (primary id
generated by above function.)
if (!existsSync(`${filePath}`)) { mkdirSync(filePath, { recursive: true }) }
cb(null, filePath);
},
filename: (_req, file, cb) => {
return cb(null, file.originalname);
},
}),
}),
)
答案 0 :(得分:1)
我已经这样做了,通过将生成的 UUID 附加到文件名 - 可能并不完美,但到目前为止对我来说已经足够好:
控制器:
@UseInterceptors(
FilesInterceptor('asset', 10, {
storage: diskStorage({
destination: UPLOADS_DIR,
filename: getUniqueFileName,
}),
limits: {
fileSize: MAX_FILE_SIZE_BYTES,
},
fileFilter: validateImageFile,
}),
)
@Post()
async createAsset(
@Body() assetCreateRequest: AssetCreateRequest,
@UploadedFile() asset: UploadedFileModel,
): Promise<AssetResponse[]> {
....
}
getUniqueFileName
看起来像这样:
import { extname } from 'path';
import { v4 as uuidv4 } from 'uuid';
import { UploadedFileModel } from '../../dto/internal/file-upload';
export const getUniqueFileName = (
_request: unknown,
file: UploadedFileModel,
callback: (error: Error | null, fileName: string) => void,
) => {
const name = file.originalname.split('.')[0];
const extension = extname(file.originalname);
const randomUuid = uuidv4();
callback(null, `${name}-${randomUuid}${extension}`);
};
稍后在数据库中,我有单独的 Asset
和例如User
表,其中 User
通过外键引用 Asset
表中的一条记录,Asset
记录包含所有必要的信息 - 文件名、路径、URL 等。>