2016-08-03 45 views

回答

0

您可以傳遞服務器方法上的數據,而不是使用文件系統,您可以將文件寫入本地磁盤。

客戶端代碼:

模板代碼:

<template name="example"> 
    <input type=file /> 
</template> 

模板事件代碼:

Template.example.events({ 
    'change input': function(ev) { 
    _.each(ev.srcElement.files, function(file) { 
     Meteor.saveFile(file, file.name); 
    }); 
    } 
}); 

Meteor.saveFile功能的代碼:

/** 
* @blob (https://developer.mozilla.org/en-US/docs/DOM/Blob) 
* @name the file's name 
* @type the file's type: binary, text (https://developer.mozilla.org/en-US/docs/DOM/FileReader#Methods) 
* 
* TODO Support other encodings: https://developer.mozilla.org/en-US/docs/DOM/FileReader#Methods 
* ArrayBuffer/DataURL (base64) 
*/ 
Meteor.saveFile = function(blob, name, path, type, callback) { 
    var fileReader = new FileReader(), 
    method, encoding = 'binary', type = type || 'binary'; 
    switch (type) { 
    case 'text': 
     // TODO Is this needed? If we're uploading content from file, yes, but if it's from an input/textarea I think not... 
     method = 'readAsText'; 
     encoding = 'utf8'; 
     break; 
    case 'binary': 
     method = 'readAsBinaryString'; 
     encoding = 'binary'; 
     break; 
    default: 
     method = 'readAsBinaryString'; 
     encoding = 'binary'; 
     break; 
    } 
    fileReader.onload = function(file) { 
    Meteor.call('saveFile', file.srcElement.result, name, path, encoding, callback); 
    } 
    fileReader[method](blob); 
} 

服務器端代碼:

/** 
* TODO support other encodings: 
* http://stackoverflow.com/questions/7329128/how-to-write-binary-data-to-a-file-using-node-js 
*/ 
Meteor.methods({ 
    saveFile: function(blob, name, path, encoding) { 
    var path = cleanPath(path), fs = __meteor_bootstrap__.require('fs'), 
     name = cleanName(name || 'file'), encoding = encoding || 'binary', 
     chroot = Meteor.chroot || 'public'; 
    // Clean up the path. Remove any initial and final '/' -we prefix them-, 
    // any sort of attempt to go to the parent directory '..' and any empty directories in 
    // between '/////' - which may happen after removing '..' 
    path = chroot + (path ? '/' + path + '/' : '/'); 

    // TODO Add file existance checks, etc... 
    fs.writeFile(path + name, blob, encoding, function(err) { 
     if (err) { 
     throw (new Meteor.Error(500, 'Failed to save file.', err)); 
     } else { 
     console.log('The file ' + name + ' (' + encoding + ') was saved to ' + path); 
     } 
    }); 

    function cleanPath(str) { 
     if (str) { 
     return str.replace(/\.\./g,'').replace(/\/+/g,''). 
      replace(/^\/+/,'').replace(/\/+$/,''); 
     } 
    } 
    function cleanName(str) { 
     return str.replace(/\.\./g,'').replace(/\//g,''); 
    } 
    } 
}); 
相關問題