【问题标题】:Upload Data to Meteor / Mongo DB将数据上传到 Meteor / Mongo DB
【发布时间】:2023-03-28 21:50:02
【问题描述】:

我有一个 Meteor 应用程序,想将数据(从 csv)上传到流星集合。

我找到了:

  • 处理文件上传的解决方案(例如Collectionfs
  • uploading directly 从 shell 到底层 mongo db 的方法
  • 对流星路由器的引用 - 但我使用的是出色的 iron-router,它似乎不提供此功能

我的要求是应用用户能够从应用内将 csv 数据上传到应用。我不需要将 csv 文件存储在应用程序文件结构中的任何位置,我只需要将 csv 数据读取到集合中。

我可能无法弄清楚如何执行此操作,因为我的职责范围(“将数据上传到流星”)不明确或不正确。或者说我是个白痴。

【问题讨论】:

  • 您可以直接在客户端将数据插入到集合中,然后流星会负责将其“上传”到服务器。这就是我在回答中所做的。

标签: mongodb csv import upload meteor


【解决方案1】:

ChristianF's answer 是正确的,我已经接受它作为正确答案。但是,它提供的功能比我现阶段所需的还要多,因此我在此处包含了我实际使用的代码——这主要取自 Christian 的回答和我因此找到的其他元素:

HTML UPLOAD BUTTON(这个阶段我不包括拖放)

<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】:

    我过去使用this gist of mine 和这段代码(使用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's subscription and sync are slow

    【讨论】:

    • 这是正确的。我已经接受了这个答案,但包括了我实际使用的代码(被剥离了一点)。非常感谢。
    猜你喜欢
    • 2014-12-01
    • 1970-01-01
    • 2023-04-10
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 2021-08-28
    相关资源
    最近更新 更多