我正在尝试将远程图像文件保存到数据库中,但我遇到了一些问题,因为我以前从未这样做过。
我需要下载图像并将其与一些其他属性一起(通过 Node 请求)传递到另一个 Node api,该 Node api 将其保存到 mysql 数据库中(使用sequelize)。我已经设法保存一些数据,但是当我手动下载并尝试打开它时,它实际上并不可用,并且没有图像显示。
我尝试了一些方法:使用 Node 请求获取图像,将其转换为 Base64 字符串(在某处阅读相关信息)并将其传递到 json 有效负载中,但这不起作用。尝试将其作为多部分发送,但这也不起作用。以前没有使用过流/缓冲区/多部分,也从未在 Node 中使用过。我尝试过研究 Node 请求管道,但我无法真正弄清楚如何将它们应用于此上下文。
这是我目前拥有的(它是 es6 类的一部分,因此没有“function”关键字;此外,请求已 promise ):
function getImageData(imageUrl) {
return request({
url: imageUrl,
encoding: null,
json: false
});
}
function createEntry(entry) {
return getImageData(entry.image)
.then((imageData) => {
entry.image_src = imageData.toString('base64');
var requestObject = {
url: 'http://localhost:3000/api/entry',
method: 'post',
json: false,
formData: entry
};
return request(requestObject);
});
}
我几乎 100% 确定问题出在这部分,因为 api 只是获取它得到的内容并将其提供给后续放入表中,但我可能是错的。图像字段设置为longblob。
一旦我弄清楚了,我确信这很简单,但到目前为止我还很困惑。
最佳答案
这不是对您的问题的直接答案,但很少需要在数据库中实际存储图像。通常的做法是将图像存储在 S3 等存储、CloudFront 等 CDN 甚至静态文件服务器的文件系统中,然后仅将图像的文件名或某些 ID 存储在实际数据库中。
如果您有机会向某些客户端提供这些图像,那么从数据库而不是 CDN 或文件系统提供这些图像将非常低效。如果您不打算提供这些图像,那么仍然没有理由将它们实际放入数据库中。您不会在数据库中查询图像的特定内容,也不会根据您使用的图像格式的特定序列对结果进行排序。
您可以做的最简单的事情就是使用唯一的文件名(随机字符串、UUID 或数据库中的 key )保存图像,并将 ID 或文件名与您需要的其他数据一起保留在数据库中。如果您需要高效地提供服务,请考虑使用 S3 或某些 CDN。
关于node.js - 使用node/request/sequelize/mysql将图像文件保存到数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41879030/