У меня есть внешнее приложение 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 })
})