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?