【问题标题】:File upload and download using meteor使用流星上传和下载文件
【发布时间】:2018-01-31 03:57:21
【问题描述】:

总的来说,我是 Meteor 和 Web 开发的新手,我想为我的流星 Web 应用程序实现以下目标:

  • 用户可以单击按钮上传 .zip 文件(我希望将其存储到我的本地数据库中,因为我正在构建在 localhost 中运行的概念验证)。
  • 文件与 Mongodb 集合的特定对象相关联。
  • 在与该对象关联的客户端页面上,可以单击按钮下载该 .zip 文件。

我发现的所有关于此的信息要么已弃用,要么涉及到 collectionFS,要么太具体/对于小众问题。事实证明,这比问题看起来更复杂!

我要寻找的是类似教程的指南,解释如何执行此操作,或者一些有助于设置以实现上述功能的代码 sn-ps。

编辑

我已经设法使用包 tomi:meteor-upload 上传文件。 然后,这会创建一个 /.uploads 文件夹,我的文件将上传到该文件夹​​。

当我尝试使用<a href="/.uploads/myfilename" download target="_blank">Download</a> 从客户端下载它们时,我发现下载的文件已损坏!

我还尝试将它们上传到 /public 文件夹而不是 /.uploads 文件夹,但仍然遇到同样的问题。

看到here,但没有找到解决方案,即使我手动 chmod 777 我的文件我也会遇到问题!

谢谢!

【问题讨论】:

  • 我认为您这样做的方式是使用 Picker 或 Iron Router 之类的东西公开服务器端路由,然后您的表单(包括文件)将发布到该路由。然后,服务器端路由将在 MongoDB 集合中创建文档。使用一些 JS 魔法(如 jQuery 或其他),您可以将其设为 AJAX 调用,而不是重新加载页面。
  • 谢谢!但是不会有更简单的解决方案吗?我觉得在我目前的时间窗口设置所有这个系统时会遇到一些麻烦,因为我正在开始我们的开发并且我之前没有设置过类似的东西。我设法找到了一个好的包来上传文件,但后来我不能再下载它们了(编辑过的帖子)!!
  • 我不知道使用 Meteor 有任何更简单的解决方案。典型的 Meteor 应用程序是 SPA(单页应用程序),这意味着路由器(Iron 路由器、流路由器等)位于客户端浏览器中并解析 URL 路径。我相信(尽管我从未亲自证明过)客户端中不匹配的 URL 模式会传递给服务器。但是,与传统的 Node.js 应用程序不同,我们没有可用的 req/res 对象。这就是像 Picker 这样的包进来的地方......它们提供了一种获取服务器请求并处理它们的方法。 (续)
  • 至于设置有多复杂,这取决于您的技能水平。我自己使用过 Picker,发现按照示例代码并开始工作非常容易。就我而言,我用它来处理 REST api 调用,我认为从头到尾我在大约 20 分钟左右的时间内就有了工作代码。但是,这只会涵盖文件上传部分。您仍然需要想出一种方法来处理下载,但我也可以看到使用 Picker 或一些类似的软件包。

标签: mongodb meteor file-upload download


【解决方案1】:

你可以试试 busboy https://github.com/mscdex/busboy

this.route('/upload', {
   where: 'server',
   method: 'POST',
   name:'upload',
   onBeforeAction: (function (req, res, next) {
    //busboy code here 
    var busboy = new Busboy({ headers: req.headers });
    busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {
       console.log('File [' + fieldname + ']: filename: ' + filename + ',    encoding: ' + encoding + ', mimetype: ' + mimetype);
       file.on('data', function(data) {
       console.log('File [' + fieldname + '] got ' + data.length + ' bytes');
    });
    file.on('end', function() {
        console.log('File [' + fieldname + '] Finished');
    });
   });
   busboy.on('field', function(fieldname, encoding, mimetype) {
    console.log('Field [' + fieldname + ']: value: ' + inspect(val));
   });
   busboy.on('finish', function() {
    console.log('Done parsing form!');
    res.writeHead(303, { Connection: 'close', Location: '/' });
    res.end();
    next();
  });
  req.pipe(busboy);
});

你可以使用file.pipe(fs.createWriteStream(saveTo));

并且saveTo是你上传的路径,例如:C:/media/,并尝试创建链接的路径例如:localhost:80/media/image-here.png使用方法将这些链接存储在您的数据库中,您可以使用APACHE进行文件托管.

【讨论】:

    猜你喜欢
    • 2012-08-01
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 2015-09-14
    • 2011-10-01
    • 2015-02-22
    相关资源
    最近更新 更多