Загрузка фотографии с измененным размером в корзину S3

Я новичок во фреймворке Nestjs и особенно в машинописном тексте. Я работаю над чем-то похожим, например, Gumtree или Wallapop. В настоящее время я загружаю фотографии в корзину S3, и моя задача - загрузить миниатюры. Загрузка простых фотографий работает нормально, но я хотел снова загрузить первую фотографию массива идентификаторов фотографий с измененным размером, которую я получил со стороны внешнего интерфейса. Фронтенд публикует одну фотографию, сервер отправляет один запрос в корзину S3, а сервер отправляет обратно созданный идентификатор и URL-адрес во фронтенд. После подачи заявки на принятие всего объявления я получил ID фотографий для сохранения в базе данных. Я хочу получить первый идентификатор массива фотографий, загрузить и снова отправить несколько файлов, которые меняют размер фотографии. Не знаю, как еще раз передать фото в мультер. Подчеркну, что использовал код изhttps://medium.com/@shamnad.ps/image-upload-to-aws-s3-using-nestjs-and-typescript-b32c079963e1, и я не понимаю, как работает весь код. Есть другой способ сделать это? Может мой подход неправильный.

Некоторые фрагменты:

Обслуживание:

      @Injectable()
export class FileUploadService {
  constructor(
    @InjectRepository(Photos)
    private readonly uploadRepository: Repository<Photos>,
    private readonly timerJobsService: TimerJobsService,
  ) {}

  async uploadSingle(@Req() req, @Res() res) {
    try {
      await this.upload(req, res, async (error) => {
        if (error) {
          if (error.code === 'LIMIT_FILE_SIZE') {
            return res
              .status(400)
              .json(`Failed to upload image file: ${error}. Max size is 2mb`);
          } else {
            return res
              .status(400)
              .json(`Failed to upload image file: ${error}`);
          }
        }

        const photo = new Photos();
        photo.url = req.files[0].location;
        photo.key = req.files[0].key;
        photo.to_archived = true;
        await this.uploadRepository.save(photo);
        this.timerJobsService.addTimeout(
          photo.id,
          photo.key,
          1000 * 60 * 60 * 24,
        );
        res.status(200).json({
          id: photo.id,
          url: photo.url,
        });
      });
    } catch (error) {
      console.log(error);
      return res.status(400).json(`Failed to upload image file: ${error}`);
    }
  }

  async uploadSingleThumbnail(@Req() req, @Res() res) {
    try {
      await this.uploadThumbnail(req, res, async () => {
        const photo = new Photos();
        photo.url = req.files[0].location;
        photo.key = req.files[0].key;
        photo.to_archived = false;
        await this.uploadRepository.save(photo);
        res.status(200).json({
          id: photo.id,
          url: photo.url,
        });
      });
    } catch (error) {
      console.log(error);
      return res.status(400).json(`Failed to upload image file: ${error}`);
    }
  }

  async downloadSingle(key: string) {
    try {
      const properties = await s3
        .getObject({
          Bucket: AWS_S3_BUCKET_NAME,
          Key: key,
        })
        .createReadStream();
      const writeStream = fs.createWriteStream(
        path.join(
          '[path]',
          key,
        ),
      );
      properties.pipe(writeStream);
    } catch (e) {
      console.log(e);
    }
  }

  upload = multer({
    storage: multerS3({
      s3: s3,
      bucket: AWS_S3_BUCKET_NAME,
      acl: 'public-read',
      key: function (request, file, cb) {
        const file1 = file.originalname;
        if (!file1.match(/\.(jpg|png|jpeg)$/)) {
          cb('Wrong file format. Only _.png _.jpg _.jpeg format', true);
        } else {
          cb(null, `${uuid()}-${file.originalname}`);
        }
      },
    }),
    limits: { fileSize: 2097152 },
  }).any();

  uploadThumbnail = multer({
    storage: multerS3({
      s3: s3,
      bucket: AWS_S3_BUCKET_NAME,
      acl: 'public-read',
      key: function (_, file, cb) {
        cb(null, `${uuid()}-${file.originalname}-thumbnail`);
      },
      resize: {
        width: 200,
        height: 150,
      },
    }),
  }).any();
}

Контроллер:

        @Post()
  @ApiOperation({ description: 'Upload photo' })
  @ApiConsumes('multipart/form-data')
  @ApiBody({
    schema: {
      type: 'object',
      properties: {
        file: {
          type: 'string',
          format: 'binary',
        },
      },
    },
  })
  async create(@Req() request, @Res() response) {
    try {
      await this.fileUploadService.uploadSingle(request, response);
    } catch (error) {
      return response
        .status(400)
        .json(`Failed to upload file: ${error.message}`);
    }
  }

  @Post()
  @UseInterceptors(FileInterceptor('file'))
  async createThumbnail(@UploadedFile() file, @Res() response) {
    try {
      await this.fileUploadService.uploadSingleThumbnail(file, response);
    } catch (e) {
      return response
        .status(400)
        .json(`Failed to upload thumbnail: ${e.message}`);
    }
  }

0 ответов

Другие вопросы по тегам