如何在嵌套js中使用multer为每次上传将图像存储在唯一文件夹(使用主键)中

时间:2021-01-21 11:51:25

标签: node.js nestjs typeorm

我有一个应用程序,我想在其中存储多部分表单数据和图像。我希望图像存储在作为主 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);
  },
}),
}),
)

1 个答案:

答案 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 等。

相关问题