2015-08-28 54 views
0

我有一個問題,讓文件上傳工作在我的項目上(PS我對Web編程比較陌生)。我使用NodeJS/Express/Mongoose/Mongo和API /後端的busboy,Angular使用ng-file-upload作爲前端。Angular/Node.js文件上傳只適用於文件<64k

我想實現一個基本的文件上傳/下載,通過該文件存儲在一個貓鼬架構:

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 

var FileSchema = new Schema({ 
    filename: { type: String }, 
    owner: { type: String }, 
    contentType: { type: String }, 
    length: { type: Number }, 
    uploaddate: { type: Date, default: Date.now }, 
    metadata: {}, 
    file: { data: Buffer, contentType: String } 
}); 

module.exports = mongoose.model('Files', FileSchema); 

節點API:

api.route('/files') 
    .post(function (req, res) { 
    if (req.busboy) { 
    var newFile = new File(); 
    var part = 0, buf = [], len = 0; 
    var meta = {}; 
    var md5 = crypto.createHash('md5'); 

    req.busboy.on('field', function (key, value, keyTruncated, valueTruncated) { 
     console.log('[FIELD] KEY:' + key + ' VALUE:' + value); 
     if (key == 'owner') newFile.owner = value; 
     else meta[key] = value; 
    }); 

    req.busboy.on('file', function (fieldname, file, filename, encoding, mimetype) { 
    console.log('File [' + fieldname + ']: filename: ' + filename + ', encoding: ' + encoding + ', mimetype: ' + mimetype); 
    newFile.filename = filename; 
    //newFile.contentType = mimetype; 

    file.on('data', function (data) { 
     console.log('File [' + fieldname + '] got ' + data.length + ' bytes'); 
     buf.push(data); 
     len = len + data.length; 
     part++; 
    }); 
    file.on('end', function() { 

     newFile.file.data = Buffer.concat(buf, part); 
     md5.update(newFile.file.data); 
     newFile.file.contentType = mimetype; 
     newFile.length = len; 
     console.log('File [' + fieldname + '] Finished'); 
     meta['md5'] = md5.digest('hex'); 
     newFile.metadata = meta; 
     newFile.save(function (err, data) { 
     if (err) console.log(err); 
     res.json({ _id: newFile._id }); 
     }) 
    }); 

    }); 
    req.pipe(req.busboy); 
} 
}); 

這適用於任何完美的罰款文件< 64KB,或在一個上傳卡盤內。我已經根據存儲的值驗證了文件MD5,並從數據庫中檢索並加載了圖像。問題在於何時上傳被分解成塊。發生某些事情導致它以某種方式變形並中斷文件。原始文件的MD5和存儲的文件> 64kb或多個塊的MD5是不同的...

我在搞什麼?

或者如果任何人有任何關於如何更好地執行此功能的建議。

謝謝!

回答

2

第二(可選)參數Buffer.concat()是陣列中的所有緩衝器的總字節長度,不是簡單地buf.length。這是一個優化,否則Buffer.concat()將不得不遍歷緩衝區來計算新緩衝區的總大小。

考慮到這一點,你就需要改變:

newFile.file.data = Buffer.concat(buf, part); 

到:

newFile.file.data = Buffer.concat(buf, len); 
+0

工作就像一個魅力!非常感謝sooo! – Eric

相關問題