使用Sequelize保存图像

时间:2017-12-07 18:37:28

标签: node.js sequelize.js

我正在创建一个使用Sequelize作为我的ORM而不是Postgres的节点应用程序。但是Sequelize文档中没有提及如何进行datablob,特别是图像保存。有谁知道:

  1. 如何使用sequelize将图像保存到数据库,例如从表单中保存。我似乎需要以某种方式将图像转换为二进制数据。
  2. 如何使用图片创建种子,以便我可以在应用程序上线之前进行测试。
  3. 以下是我的示例模型的迁移文件

    export default {
      up: (queryInterface, Sequelize) => {
        return queryInterface.createTable('Users', {
          id: {
            allowNull: false,
            autoIncrement: true,
            primaryKey: true,
            type: Sequelize.INTEGER,
          },
          firstName: {
            allowNull: false,
            type: Sequelize.STRING,
          },
          lastName: {
            type: Sequelize.STRING,
          },
          photo: { <--------------------------- Image
            type: Sequelize.BLOB,
          },
          email: {
            type: Sequelize.STRING,
          },
          createdAt: {
            allowNull: false,
            type: Sequelize.DATE,
          },
          updatedAt: {
            allowNull: false,
            type: Sequelize.DATE,
          },
        });
      },
      down: (queryInterface, Sequelize) => {
        return queryInterface.dropTable('Users');
      },
    };
    

    以及小种子文件

    export default {
      up: (queryInterface, Sequelize) => {
        /*
          Add altering commands here.
          Return a promise to correctly handle asynchronicity.
    
          Example:
          return queryInterface.bulkInsert('Persons', [{
            name: 'John Doe',
            isBetaMember: false
          }], {});
        */
        return queryInterface.bulkInsert('Users', [
          {
            firstName: 'Ricky',
            lastName: 'Sparks',
            // photo: <---------- what should I fill in here to seed with a photo file?
            email: 'email@gmail.com',
            createdAt: Sequelize.fn('NOW'),
            updatedAt: Sequelize.fn('NOW'),
          },
        ]);
      },
    
      down: (queryInterface, Sequelize) => {
        /*
          Add reverting commands here.
          Return a promise to correctly handle asynchronicity.
    
          Example:
          return queryInterface.bulkDelete('Persons', null, {});
        */
    
        return queryInterface.bulkDelete('Users', null, {});
      },
    };
    

1 个答案:

答案 0 :(得分:1)

您可以尝试Sequelize-file,让它处理文件存储,与模型关联以及从blob读回。除此之外,您可以使用缓冲区,在您正在使用的框架的请求对象中流,模块通常会公开缓冲区或流或其他任何内容。

流程通常如下所示。

提交时

  • 提交表单 - &gt; http请求对象 - &gt;读缓冲区 - &gt; store to blob

回复时

  • 从blob读取 - &gt;缓冲 - &gt;构建http响应。

关于测试,您可以手动创建一些文件以及正确值为width / height / image type / etc的json文件,并使用它们以某种方式读取和提交或模拟文件。

我个人会尽量避免将文件存储到数据库中,因为你看到它甚至在理论上很难并且不容易测试等。相反,你可以将文件存储在带有编码文件名的文件系统中,将信息存储在数据库中,测试存在等等除非必要,否则比做所有这些更容易。