我有一个Meteor应用程序,并希望将数据(从csv)上传到流星集合。
我找到了:
我的要求是应用用户可以从应用内将csv数据上传到应用。我不需要将csv文件存储在app文件结构中的任何位置,我只需读取 csv数据到集合中。
我可能无法弄清楚如何执行此操作,因为我的参考条款('将数据上传到meteor')不明确或不正确。或者我是个白痴。
答案 0 :(得分:6)
ChristianF's answer已成为现实,我已接受它作为正确答案。但是,它在这个阶段提供的东西比我需要的还要多,所以我在这里包含了我实际使用的代码 - 这主要取自Christian的答案以及我发现的其他元素:
HTML上传按钮(我现阶段不包括拖放)
<template name="upload">
<input type="file" id="files" name="files[]" multiple />
<output id="list"></output>
</template>
<强> JAVASCRIPT 强>
Template.upload.events({
"change #files": function (e) {
var files = e.target.files || e.dataTransfer.files;
for (var i = 0, file; file = files[i]; i++) {
if (file.type.indexOf("text") == 0) {
var reader = new FileReader();
reader.onloadend = function (e) {
var text = e.target.result;
console.log(text)
var all = $.csv.toObjects(text);
console.log(all)
_.each(all, function (entry) {
Members.insert(entry);
});
}
reader.readAsText(file);
}
}
}
})
请注意,Meteor有一个jquery-csv库:https://github.com/donskifarrell/meteor-jquery-csv
答案 1 :(得分:2)
我过去使用this gist of mine和此代码(使用jquery-csv插件解析csv数据)解决了这个问题。这是在客户端完成的,与是否使用铁路由器无关。将插入代码移动到Meteor方法,首先上传csv文件然后在服务器上解析和插入数据是相当简单的。我也尝试过,但没有看到任何性能提升。
$(document).ready(function() {
var dd = new dragAndDrop({
onComplete: function(files) {
for (var i = 0; i < files.length; i++) {
// Only process csv files.
if (!f.type.match('text/csv')) {
continue;
}
var reader = new FileReader();
reader.onloadend = function(event) {
var all = $.csv.toObjects(event.target.result);
// do something with file content
_.each(all, function(entry) {
Items.insert(entry);
});
}
}
}
});
dd.add('upload-div'); // add to an existing div, turning it into a drop container
});
请注意,如果您要插入大量条目,那么最好将所有反应性重新渲染关闭一段时间,直到插入所有条目。否则,服务器上的节点和浏览器选项卡都将变得非常慢。请在此处查看我建议的解决方案:Meteor's subscription and sync are slow