2014-09-20 186 views
3

我需要一點幫助 與NodeJS和MySQL blob插入。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文件)我收到消息說 文件已損壞。

我必須在從文件讀取緩衝區時出錯。

+0

你不能只連接一個緩衝成一個查詢。事實上,你不應該將任何東西連接到查詢中。你如何插入Blob完全取決於你正在使用的MySQL庫。你能告訴我們嗎? – Brad 2014-09-20 17:21:10

回答

6

嘗試更換:

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) { 

你也可能要改變file: bufferfile: buffer.slice(0, 100),因爲你只讀取前100個字節的文件。如果buffer.length > 100那麼你可能會在buffer的前100個字節後面出現一堆額外的垃圾字節。

3

謝謝你的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; 
     }); 

    }); 
}); 
0

對於小文件,你可以試試下面的代碼:

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 
    } 
})