我一直在尝试让
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
,但似乎没有帮助。
幸运的是,这是我在文档中忽略的简单内容。
我希望这个社区可以帮助我找到我的方式的错误。
感谢您的集体关注。
我已经找到并解决了问题。
问题是我试图发送的数据是文字对象而不是
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);
我在损坏的代码中看到了“类型:缓冲区”,但没有看到值周围的花括号!
感谢关注。我把这个问题留在这里,自己回答,希望它能帮助其他需要做同样事情的开发者。