上传数据到Meteor/Mongo DB

6
我有一个Meteor应用程序,想要将数据(来自csv)上传到Meteor集合。
我发现:
- 解决方案(例如Collectionfs),处理文件上传 - 直接从shell上传到基础mongo db的方法 - 对Meteor路由器的引用 - 但我正在使用出色的iron-router,它似乎没有提供此功能
我的要求是,应用程序用户能够从应用程序内部上传csv数据到应用程序。 我不需要在应用程序文件结构中存储csv文件,我只需要将csv数据读取到集合中。
可能是因为我的参考条件(“将数据上传到Meteor”)不明确或不正确,所以我无法解决这个问题。 或者是因为我很蠢。

你可以直接在客户端将数据插入到集合中,Meteor会负责将其“上传”到服务器。这就是我在我的回答中所做的。 - Christian Fritz
2个回答

6

ChristianF的回答非常准确,我已经接受它作为正确答案。然而,这个回答提供的内容对我来说有些多余,所以我在这里包含了我实际使用的代码 - 这主要是从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


2

我曾经使用这个代码片段和这段代码(使用jquery-csv插件解析CSV数据)来解决这个问题。这是在客户端完成的,与是否使用iron-router无关。将插入代码移动到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的订阅和同步速度很慢


这非常准确。我已经接受了这个答案,但是包括了我实际使用的代码(稍微简化了一些)。非常感谢。 - Alex Webster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接