Create a Meteor app and put the client_/server_ files in a client/server directories. Also, create a public dir to save the uploaded files.
- 
            
      
        
      
    Star
      
          
          (175)
      
  
You must be signed in to star a gist  - 
              
      
        
      
    Fork
      
          
          (41)
      
  
You must be signed in to fork a gist  
- 
      
 - 
        
Save dariocravero/3922137 to your computer and use it in GitHub Desktop.  
| Template.example.events({ | |
| 'change input': function(ev) { | |
| _.each(ev.srcElement.files, function(file) { | |
| Meteor.saveFile(file, file.name); | |
| }); | |
| } | |
| }); | 
| <template name="example"> | |
| <input type=file /> | |
| </template> | 
| /** | |
| * @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,''); | |
| } | |
| } | |
| }); | 
After looking into different possible solutions to file uploads with Meteor 1.3 and React, I couldn't find a suitable solution. This script helped a great deal. I can upload after a few small tweaks. Of course, for Meteor 1.3 and 1.4, it works without an error after installing fs rather than using fs = Npm.require('fs'):
meteor npm install --save fs
Then, in the server_save_files.js, I added this line on the top:
import fs from 'fs';
Next thing to figure out is: How to implement a progress bar for the upload?
Need to make the following changes to have this working in meteor 1.3
- import fs from 'fs'; (instead of fs = meteor_bootstrap.require('fs'))
 - Change chroot to chroot = '../../../../../public';
 - In helper function change the ev.srcElement.files to ev.currentTarget.files
 
Works like a charm after that. Thanks for the tutorial.
code is not working. :(
# Thanks alot man #dariocravero
Working.
Without any package.
Thanks
can anyone tell how to create persistence storage in development mode for meteor. Whenever server starts either remove data or give this error
Error: EBUSY: resource busy or locked, rmdir 'C:\Users\admins\Desktop\tripsy\dummy.meteor\local\build\programs\server'
at Error (native)

How to change this code to fs write stream, as it is not perfect for Bigger Uploads?, Can you suggest something?