Upload Data to Meteor / Mongo DB

后端 未结 2 779
你的背包
你的背包 2021-02-04 19:03

I have a Meteor app and would like to upload data (from csv) to a meteor collection.

I have found:

  • solutions (e.g. Collectionfs) which deal with file uploa
相关标签:
2条回答
  • 2021-02-04 19:46

    I've solved this problem in the past using this gist of mine, together with this code (using the jquery-csv plugin to parse the csv data). This is done on the client side and is independent of using iron-router or not. It would be fairly straightforward to move the insertion code into a Meteor method, uploading the csv file first and then parsing and inserting the data on the server. I've tried that, too, but didn't see any performance improvement.

    $(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
    });
    

    Beware though that if you are inserting a lot of entries, then you are better off turning all reactive rerendering off for a while, until all of them are inserted. Otherwise, both node on the server and the browser tab will get really slow. See my suggested solution here: Meteor's subscription and sync are slow

    0 讨论(0)
  • 2021-02-04 19:50

    ChristianF's answer is spot on and I have accepted it as the correct answer. However, it provides even more than I need at this stage, so I am including here the code I have actually used - which is largely taken from Christian's answer and other elements I have found as a result:

    HTML UPLOAD BUTTON (I am not including drag and drop at this stage)

    <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);
          }
        }
      }
    })
    

    NB there is a jquery-csv library for Meteor here: https://github.com/donskifarrell/meteor-jquery-csv

    0 讨论(0)
提交回复
热议问题