Как отправить буферизованное изображение как JSON в другой API? - PullRequest
0 голосов
/ 11 июля 2020

Я отправляю данные с веб-страницы в другой разработанный мной API, который будет получать их в форме JSON. Эта веб-страница имеет форму, а данные формы содержат 2 изображения и некоторые текстовые данные. Что я сделал, так это то, что я поместил изображение в буфер с помощью Multer и переназначил исходный req.body.userImage для буферизованного изображения. API на другом конце получит все req.body как JSON и сохранит его в базе данных MongoDB. Поскольку тип данных userPicture - Buffer, я поместил в буфер изображение, загруженное с помощью формы, и теперь пытаюсь отправить его в этот API. Но буферизованное изображение не может быть отправлено, так как это проект Node.js, который я использовал HTTP-метод Node.js, я также использовал некоторые другие модули из NPM, и от всех них я получаю то же самое код ошибки: 413 (слишком большая полезная нагрузка). Как теперь отправить буферизованное изображение? Должен ли я изменить дизайн API на другом конце, чтобы сначала получить необработанное изображение, а затем сразу же после этого поместить изображение в буфер? Если это так, то как я могу отправить необработанное изображение в этот API?

const upload = multer({
  limits: {
    fileSize: 2000000,
  },
  fileFilter(req, file, cb) {
    if (!file.originalname.match(/\.(jpg|png|jpeg|svg)$/)) {
      return cb(new Error("Please upload an image"));
    }
    cb(undefined, true); //means go ahead and accept the given upload
  },
});

app.post("/postData", upload.any('photos'), async (req, res) => {

  console.log('data send here')

  // console.log(req.body)
  // console.log(req.body.name)
  // console.log(req.files[0].buffer)

  let distroLogo = await sharp(req.files[0].buffer)
    .resize({
      width: 300,
      height: 300
    })
    .png()
    .toBuffer();

  req.body.logo = distroLogo

  let userPicture = await sharp(req.files[1].buffer)
    .resize({
      width: 300,
      height: 300
    })
    .png()
    .toBuffer();

  req.body.userProfilePicture = userPicture

  const data = JSON.stringify(req.body)
  const options = {
    hostname: '***API ADDRESS***',
    port: 443,
    path: '/**PATH**',
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Content-Length': data.length
    }
  }

  const reque = https.request(options, (res) => {
    console.log(`statusCode: ${res.statusCode}`)

    reque.on('data', (d) => {
      process.stdout.write(d)
    })
  })

  reque.on('error', (error) => {
    console.error(error)
  })

  reque.write(data)
  reque.end()
}), (error, req, res, next) => {
  res.status(400).send({
    error: error.message
  })
}

Ответы [ 2 ]

0 голосов
/ 11 июля 2020

Я исправил проблему, используя ограничение bodyParsers и расширенные параметры, это означает, что я использовал следующий код, чтобы увеличить ограничение bodyParser, чтобы принимать значения, превышающие значение по умолчанию.

Добавлен код:

app.use(bodyParser.json({
  limit: "50mb"
}));
app.use(bodyParser.urlencoded({
  limit: "50mb",
  extended: true,
  parameterLimit: 50000
}));

Я использовал следующий пост для решения своей проблемы:

Node.js Express. js bodyParser POST limit

0 голосов
/ 11 июля 2020

Вы можете использовать заголовок «Transfer-Encoding: chunked». Если ваши запросы еще не используют сжатие, вы можете использовать: gzip, br или deflate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...