Я пытаюсь сохранить некоторые изображения в MySQL. Я использую express, multer
для загрузки / выгрузки изображения и multer для обработки загрузки изображений соответственно. В моей таблице MySQL у меня есть тип столбца longblob. В узле js я пытаюсь сохранить изображение следующим образом:
const avatar = req.file.buffer;
const avblob = Buffer.from(toArrayBuffer(avatar)).buffer;
В моем запросе SQL я сохраняю буфер avblob
как BINARY(avblob)
. Значение отображается как [object ArrayBuffer]
. Я пытаюсь получить доступ к этому изображению, используя его идентификатор, записать во временный файл и отправить его в ответ. Вот что я пытаюсь сделать:
fs.writeFileSync(__dirname+avatar[0].name+avatar[0].ext, avatar[0].avatar);
res.sendFile(__dirname+avatar[0].name+avatar[0].ext, (err) => {
if(err) {
console.error(err);
return res.status(500)
.json({
status: 500,
message: 'Internal Error'
});
}
res.status(200)
.json({
status: 200,
message: 'Image Sent'
});
});
, где avatar
- это RowDataPacket
из mysql, где ext
- это либо .jpeg
, либо .png
, name
- это произвольное имя, avatar
- данные большого двоичного объекта изображения. Когда я отправляю файл обратно, ответ приходит как ArrayBuffer
. Я попытался сохранить файл в формате JPEG. Однако при попытке открыть файл был поврежден.
Итак, как мне сохранить и получить блоб изображения в nodejs? В моем подходе, что я не делаю или делаю неправильно? Наконец, когда я отправляю файл обратно как ответ, как я могу сообщить клиенту тип файла изображения, jpeg или png, чтобы он мог сохранить файл, используя правильное расширение?
РЕДАКТИРОВАТЬ 1
Я проверил заголовок Content-Type
и его изображение / JPEG. Попытка сохранить буфер в кодировке bas64 и получить его также не работает.
РЕДАКТИРОВАТЬ 2
Поскольку я не нашел решения, я сейчас просто сохраняю файл в каталоге и сохраняю метаданные файла в базе данных. Пока это работает, но все равно было бы здорово выяснить, можно ли это сделать.