Файловый объект из буфера не будет загружен в WordPress - PullRequest
0 голосов
/ 06 мая 2019

У меня есть внешнее приложение JavaScript, которое используется для управления удаленным магазином WooCommerce.Помимо прочего, приложение отправляет файлы изображений во внутреннее приложение для изменения размера и хранения в базе данных, а затем загружает полученное изображение в WordPress.

Внутренняя логика выглядит следующим образом:

  • Используйте Multer для захвата файла и возврата буфера
  • Используйте Sharp для изменения размера буфера, установки качества JPEG, возврата другого буфера
  • Запись буфера (и некоторых другихвещи) в MongoDB
  • Вернуть запись MongoDB

Как только клиентский интерфейс получает ответ, он создает новый объект File из результата.Все выглядит правильно, когда я console.log файл, но я продолжаю получать следующую ошибку от WP REST API:

{
  code: "rest_upload_unknown_error",
  data: {
    status: 500
  },
  message: "Sorry, this file type is not permitted for security reasons."
}

После длительного тестирования, я думаю, что могууверенно говорю, что проблема в том, как я перевожу данные из серверной части в новый объект File.Я не женат на этой точной методологии, но мне нужно отправить файл на сервер для обработки и хранения, а затем использовать информацию, записанную в базу данных, для отправки запроса WP API от внешнего интерфейса.

Текущий код ниже.

Код на стороне клиента:

class Image {
  async save() {
    const { data } = await axios.post(
      endpoint,
      formData,
      {
        headers: {
          "Content-Type": "multipart/form-data"
        }
      }
    )

    this.image = {
      name: data.image.name,
      buffer: new Uint8Array(data.image.buffer.data)
    }
    return Promise.resolve()
  }

  async upload() {
    const wp = new wpapi({
      endpoint: `${host}/wp-json`
    }).setHeaders({
      Authorization: `Bearer ${token}`
    })

    const file = new File(
      this.image.buffer,
      `${this.image.name}.jpg`,
      { type: "image/jpeg" }
    )

    return wp
      .media()
      .file(file, `${this.image.name}.jpg`)
      .create()
  }
}

Код на стороне сервера:

const upload = multer({ storage: multer.memoryStorage() }).single("file")

router.post("/", upload, async (req, res) => {
  const img = req.file.buffer
  const buffer = await sharp(img)
    .resize(1200, 1200, { fit: "inside" })
    .jpeg({ quality: 60 })
    .toBuffer()

  const image = await Image.create({
    name: "the-image-name",
    buffer
  })

  return res.status(201).json({ image })
})

1 Ответ

0 голосов
/ 10 мая 2019

Эрик

Если вы не «женаты на методологии», то, я думаю, вам следует прочитать эту статью: https://medium.com/bantam-io/image-upload-and-modification-bantam-style-f79bae3da12f.

Я использую загрузку bantam.io без сервера и модификацию изображенийдля большинства моих клиентов сохраните только окончательный URL-адрес в mongodb.Это держит вещи очень чистыми.

...