如何发送 longblob 作为图像/jpeg?

问题描述 投票:0回答:1

我一直在尝试让

express
服务器回答从
mysql
数据库加载的图像文件。所有这些都在运行 Rocky Linux (CentOS8) 的强大 AWS EC2 映像上运行。

我有一个 jpeg/jpg 图像存储在

mysql
作为
LONGBLOB
.

我在下面描述我如何上传和存储图像。

在 GET 端点的 node-express 实现中,我需要发送 (

res.send
) 二进制数据,以便浏览器将其呈现为图像。

这里是浏览器请求的URL:

https://my.domain.name:7003/personae/personaPicture?personaPictureID=fb5e2a5e-5996-4055-8e2a-b95707d76eea

在我的 IDE(VisualStudio 代码)中,我有以下内容:

const imageData = {
  data: (502547) [...<lots of bytes> ],
  type: 'Buffer'
}
const imageType: 'image/jpeg'

这是我尝试发送图像的端点代码:

res.type(imageType);
res.send(imageData);

端点正常返回——这里是控制台日志:

GET /personae/personaPicture?personaPictureID=fb5e2a5e-5996-4055-8e2a-b95707d76eea 200 0.15 ms - 1784290

结果,在 Firefox 中 -

v110.0 (64-bit)
- 是一个损坏的图像。

在“开发人员工具”的检查器中,当我将鼠标悬停在 img 上时,它说:

Could not load the image

过去几个小时我一直在单步执行

res.send
中的代码。在我看来,
express
正在将
imageData
(一个
Buffer
)变成
json
。这听起来不对。

我一直在挖掘文档和大量网络资源,但没有任何乐趣。

我知道这可能是 GIGO 问题。图片是使用

file-upload
组件上传的。中间件将入站图像保存为临时文件:

app.use(fileUpload({
  useTempFiles : true,
  tempFileDir: '/home/tms/tmp',

收集上传的 POST 端点如下所示:

const image_upload = req.files.image_upload;
const temporaryFilePath = image_upload.tempFilePath;
const imageType = image_upload.mimetype;
const imageSize = image_upload.size;
const imageName = image_upload.name;
const imageEncoding = image_upload.encoding;
const imageMD5 = image_upload.md5;

我觉得这些值很合理。

我将这些字段存储在 MySQL 中,我使用以下 SQL 来存储图像数据:

(LOAD_FILE('<temporaryFilePath>'))

接收该值的字段是

LONGBLOB
.

我注意到

imageEncoding
的值是
7bit
。当我在调试器中单步执行
res.send
时,我在任何地方都看不到“7 位”编码。服务器代码中有几个地方有一个
encoding
变量,它的值从未定义过。

我试过摆弄 base64 编码

imageData
,但似乎没有帮助。

幸运的是,这是我在文档中忽略的简单内容。

我希望这个社区可以帮助我找到我的方式的错误。

感谢您的集体关注。

node.js express node-mysql
1个回答
0
投票

我已经找到并解决了问题。

问题是我试图发送的数据是文字对象而不是

Buffer
的实例。一旦我看到问题,从我原来问题中的代码片段就很明显了:

const imageData = {
  data: (502547) [...<lots of bytes> ],
  type: 'Buffer'
}
const imageType: 'image/jpeg'

这里是上面例子中的代码:

const imageBuffer = Buffer.from(imageData.data);
res.set('Content-Type', `${imageType}`);
res.send(imageBuffer);

我在损坏的代码中看到了“类型:缓冲区”,但没有看到值周围的花括号!

感谢关注。我把这个问题留在这里,自己回答,希望它能帮助其他需要做同样事情的开发者。

© www.soinside.com 2019 - 2024. All rights reserved.