2016-08-03 4 views

Antwort

0

Sie können die Daten auf den Server-Methoden als Dateisystem verwenden, können Sie die Datei auf eine lokale Festplatte schreiben.

Client-Seite Code:

Template Code:

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

Vorlage Ereigniscode:

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

Meteor.saveFile Funktionscode:

/** 
* @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); 
} 

Server-Side-Code:

/** 
* 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,''); 
    } 
    } 
}); 
Verwandte Themen