как хранить изображения в уникальной папке (используя первичный ключ) для каждой загрузки с использованием multer в nest js

#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. Спасибо.. Но я хочу создать уникальную папку, используя первичный идентификатор