node.js - 使用node/request/sequelize/mysql将图像文件保存到数据库中

标签 node.js blob sequelize.js node-request

我正在尝试将远程图像文件保存到数据库中,但我遇到了一些问题,因为我以前从未这样做过。

我需要下载图像并将其与一些其他属性一起(通过 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/

相关文章:

node.js - 使用 Node.js 插入数据

javascript - AngularJS + ng 文件上传 + Sails JS

sql - 如何在 Oracle SQL Developer 中编辑 BLOB(包含 JSON)?

java - 使用 BLOB 或 TEXT/CLOB 在字段中保存 HTML 数据

mysql - 如何将类型 blob 图像显示到 ejs 网页?

node.js - 通过 nodejs 查询 mongodb 显示空结果?

node.js - Mongodb反向匹配API端点路径

express - 最新的 Sequelizejs (4.0.0-0) 可以与 ExpressJS 集成吗

node.js - serverless webpack 配置,手动添加目录

node.js - Sequelize - 如何设计一对一关联?