I need a little help with NodeJS and MySQL blob insertion.
Here's the code snippet i'm using
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;
});
});
});
Query inserts the file in the table and I get the correct file size, but when I try to retrieve the file and open it ( for example a PDF file ) I get a message saying that the file is corrupted.
I must be doing something wrong with the buffer reading from the file.
Try replacing:
var query ="INSERT INTO `files` (`file_type`, `file_size`, `file`) VALUES ('img', " + getFilesizeInBytes(temp_path) + ",'" + buffer + "' );";
mySQLconnection.query(query, function (er, da) {
with:
var query = "INSERT INTO `files` SET ?",
values = {
file_type: 'img',
file_size: buffer.length,
file: buffer
};
mySQLconnection.query(query, values, function (er, da) {
You may also want to change file: buffer
to file: buffer.slice(0, 100)
since you are only reading the first 100 bytes of the file. If buffer.length > 100
then you may end up with a bunch of extra garbage bytes after the first 100 bytes in buffer
.
Thank you mscdex for the snippet.
The problem was as you pointed out that i was reading only first 100 bytes of data. BTW thank you for the snippet and here's the whole solution. Hope it can help someone :-)
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;
});
});
});
For the small files, you can try below code:
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
}
})
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With