NodeJS mySQL插入Blob

8

我需要在NodeJS和MySQL中插入Blob数据类型,需要一些帮助。

这是我正在使用的代码片段:

fs.open(temp_path, 'r', function (status, fd) {
    if (status) {
        console.log(status.message);
        return;
    }
    var buffer = new Buffer(getFilesizeInBytes(temp_path));
    fs.read(fd, buffer, 0, 100, 0, function (err, num) {
    var query ="INSERT INTO `files` (`file_type`, `file_size`, `file`) VALUES ('img', " + getFilesizeInBytes(temp_path) + ",'" + buffer + "' );";
    mySQLconnection.query(query, function (er, da) {
   if (er)throw er;
   });
  });
});

查询将文件插入表中,我得到了正确的文件大小,但是当我尝试检索文件并打开它(例如一个PDF文件),我会收到一个消息,说文件已损坏。

我肯定在从文件中读取缓冲区时出了问题。


你不能仅仅将缓冲区连接到查询中。事实上,你永远不应该将任何东西连接到查询中。如何插入Blob完全取决于你使用的MySQL库。你能告诉我们吗? - Brad
4个回答

16

尝试进行替换:

var query ="INSERT INTO `files` (`file_type`, `file_size`, `file`) VALUES ('img', " + getFilesizeInBytes(temp_path) + ",'" + buffer + "' );";
mySQLconnection.query(query, function (er, da) {

随着:

var query = "INSERT INTO `files` SET ?",
    values = {
      file_type: 'img',
      file_size: buffer.length,
      file: buffer
    };
mySQLconnection.query(query, values, function (er, da) {

由于您只读取文件的前100个字节,因此您可能还希望将file: buffer更改为file: buffer.slice(0, 100)。如果buffer.length > 100,则在buffer的前100个字节之后可能会有大量额外的垃圾字节。


我很好奇。我有一个类似的问题。但是我的查询中不仅有文件,还有普通数字和文本。 - joeyipod

6

感谢mscdex提供的代码片段。

就像你所指出的问题一样,我只读取了前100个字节的数据。顺便说一下,感谢你的代码片段,这里是整个解决方案。希望它可以帮助到某些人 :-)

fs.open(temp_path, 'r', function (status, fd) {
    if (status) {
        console.log(status.message);
        return;
    }
    var fileSize = getFilesizeInBytes(temp_path);
    var buffer = new Buffer(fileSize);
    fs.read(fd, buffer, 0, fileSize, 0, function (err, num) {

        var query = "INSERT INTO files SET ?",
            values = {
                file_type: 'img',
                file_size: buffer.length,
                file: buffer
            };
        mySQLconnection.query(query, values, function (er, da) {
            if(er)throw er;
        });

    });
});

1
对于小文件,您可以尝试以下代码:

var fileInsertSQL = "insert ignore into File(id, content, creationTime) values(?,?,?)";
db.query(fileInsertSQL, ["id1", fs.readFileSync(filepath), new Date().getTime()], function (err, dbRes) {
    if(err){
        console.error(err);
    } else {
        //Do something
    }
})

0

尝试使用Multer缓冲区:

let query = "UPDATE yourtable SET image=? WHERE id = '1'"
let obj = req.file.buffer;
conn.query(query, obj, function (err, rows, fields) {})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接