#node.js #nestjs #typeorm
#node.js #nestjs #typeorm
Вопрос:
У меня есть приложение, в котором я хочу хранить данные формы из нескольких частей вместе с изображением. Я хочу, чтобы изображения хранились в уникальной папке, которая является основным идентификатором. Как я могу это сделать.
Здесь я сохраняю многоформные данные в базе данных. Я хочу использовать возврат основного идентификатора с помощью функции ниже, чтобы создать папку для сохранения соответствующих изображений.
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;
}
}
как я могу использовать первичный идентификатор, полученный с помощью переменной «savedMediaUpload» в multer
мой код 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);
},
}),
}),
)
Ответ №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 и т.д.
Комментарии:
1. Спасибо.. Но я хочу создать уникальную папку, используя первичный идентификатор