【问题标题】:Read an uploaded file line-by-line (FS.File, stored using cfs:gridfs)逐行读取上传的文件(FS.File,使用 cfs:gridfs 存储)
【发布时间】:2015-07-21 17:50:14
【问题描述】:

我有一个 Meteor 应用程序,我想在其中上传一个文本文件,然后在服务器上解析该文件。我正在使用cfs:gridfs(当然是cfs:standard-package)将文件存储在服务器上。

客户端代码:

Template.uploadPathway.events({
  "submit #upload-pathway": function (event) {
    event.preventDefault(); // prevent default browser form submit

    var pathwayFile = event.target.pathwayFile.files[0];

    UploadedFiles.insert(pathwayFile, function(error, fileObject) {
      // error handling removed for brevity
      Meteor.call("parseFile", fileObject._id);
    });
  }
});

服务器代码(在服务器文件夹中,而不是 Meteor.isServer):

Meteor.methods({
  parseFile: function (fileId) {
    var theFile = UploadedFiles.findOne({ _id: fileId });
    console.log(theFile);
    // how do I parse this file??
  }
});

上面的代码效果很好,但我不知道如何读取 FS.File 中的数据

【问题讨论】:

  • 您可以使用theFile.createReadStream() 来读取文件。一旦你有了它,你可以搜索堆栈溢出,了解如何在给定流的情况下逐行读取文本文件,例如stackoverflow.com/questions/6156501/…
  • @ChristianFritz:问题是theFile.createReadStream() 会崩溃,因为文件还没有完成保存。 (请参阅下面的答案。)

标签: javascript meteor gridfs


【解决方案1】:

Eric Dobbertin's回答我的问题:

首先,请注意,当insert 回调在客户端上触发时, 文件可能尚未完成上传,即使它已经完成 上传,可能无法完成存储到数据存储。所以打电话给你 insert 回调中的方法不是这样做的好方法。

如果你需要在一个方法中做,因为你要读取数据 并将一些东西发回给客户,然后你可以设置一个 autorun 等待fileObj.hasStored(storeName) 的函数 成为true。然后您可以调用该方法并停止自动运行 计算。 (link to hasStored documentation)

尝试类似的方法,然后看看您的代码是否有效。根据 你到底想对数据做什么,可能有一些 比“数据”事件处理程序更好的方法。

如果客户不需要参与,那么更简单的方法是 存储每个文件后触发您的代码是使用“存储” 店里的听众:

UploadedFileStore.on("stored", function (storeName, fileObject) {
  if (storeName !== UploadedFileStore.name) return; // workaround for known bug

  // your code

  fileObject.createReadStream("uploaded_files")
    .on('data', function (chunk) {
      console.log("chunk: " + chunk);
    });
});

【讨论】:

    猜你喜欢
    • 2013-01-26
    • 2019-09-21
    • 1970-01-01
    • 2014-08-27
    • 2016-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多