我正在尝试将远程图像文件保存到数据库中,但我遇到了一些问题,因为我以前从未这样做过。
我需要下载图像并将其与其他一些属性一起传递(使用node-request)给另一个节点api,后者将其保存到mysql数据库中(使用sequelize)。我已经设法保存了一些数据,但当我手动下载并尝试打开它时,它并不是真正可用的,并且没有图像显示。
我尝试了几种方法:使用node-request获取图像,将其转换为base64字符串(在其他地方阅读到),并在json有效负载中传递它,但这不起作用。尝试将其作为多部分发送,但也不起作用。我以前没有使用过流/缓冲区/多部分,也从来没有在节点中使用过。我尝试过研究节点请求管道,但我不能真正弄清楚如何将它们应用到这个上下文中。
这是我目前所拥有的(它是一个函数类的一部分,所以没有‘es6’关键字;还有,请求被删节了):
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);
});
}我几乎百分之百确定问题出在这一部分,因为api只是接受它得到的东西,并将其序列化以放入表中,但我可能错了。Image字段设置为longblob。
我敢肯定,一旦我弄明白了,这是很简单的事情,但到目前为止,我被难住了。
发布于 2017-01-27 01:37:34
这不是对您问题的直接回答,但很少需要在数据库中实际存储图像。通常所做的是将镜像存储在诸如S3、CDN之类的存储器上,或者甚至只是存储在静态文件服务器的文件系统中,然后仅将镜像的文件名或某个ID存储在实际的数据库中。
如果您打算将这些映像提供给一些客户端,那么从数据库而不是CDN或文件系统为它们提供服务将是非常低效的。如果您不打算提供这些图像,那么仍然没有什么理由真正将它们放入数据库中。这不像是要查询数据库以获取图像的特定内容,也不是根据所使用的图像格式的特定序列化对结果进行排序。
您可以做的最简单的事情是使用唯一的文件名(随机字符串、UUID或数据库中的关键字)保存图像,并将ID或文件名与您需要的其他数据一起保存在数据库中。如果你需要高效的服务,那么可以考虑使用S3或者一些CDN。
https://stackoverflow.com/questions/41879030
复制相似问题