是否有一项服务可以创建基本上一次性下载文件,最好是我可以从 NodeJS 使用的东西?
我对 FilePicker 进行了一些研究,但没有发现任何有关重新生成它为您提供的文件链接的信息。可能有一种方法可以用 NodeJS 做到这一点,但我同时使用 Meteor,所以很多 Node 的事情可能会发生冲突。
是否有一项服务可以创建基本上一次性下载文件,最好是我可以从 NodeJS 使用的东西?
我对 FilePicker 进行了一些研究,但没有发现任何有关重新生成它为您提供的文件链接的信息。可能有一种方法可以用 NodeJS 做到这一点,但我同时使用 Meteor,所以很多 Node 的事情可能会发生冲突。
你可以用流星构建它。将流星路由器与流星一起使用并使用服务器端路由来传递文件。
您需要一个集合来跟踪下载的文件:
服务器 JS
var downloads = new Meteor.Collection("downloads");
//create a link
downloads.insert({url:"/mydownload.zip",downloaded:false})
Meteor.Router.add('/file/:id', 'GET', function(id) {
download = downloads.findOne(id);
if( download) {
if(dowload.downloaded) {
this.response.send("You've already downloaded me")
}
else
{
//I guess you could just redirect or stream the file for an extra layer of surety
this.response.redirect(download.url);
}
}
});
在客户端上,您可以将/files/{{_id}}
下载的文件的 _id 用作链接
我的建议也是添加自定义服务器端逻辑以计算上传次数(或仅将文件标记为已下载/未下载)并做出相应响应。您可以使用 Filepicker.io 做的最接近的事情是使用安全策略将文件下载限制在特定的时间间隔内。
使用 Heroku Cloud 和 NodeJS Meteor Hooks 的解决方案
Heroku 尤其适用于临时文件下载链接:它们提供了一个“临时暂存器”文件系统,每次程序重新启动时都会重置,并且每个运行的节点服务器都看不到其他实例创建的文件。
每个 dyno 都有自己的临时文件系统,以及最近部署的代码的新副本。在 dyno 的生命周期中,它的运行进程可以将文件系统用作临时暂存器,但是任何其他 dyno 中的进程都看不到写入的文件,并且在停止或重新启动 dyno 时,任何写入的文件都将被丢弃。
取自 Heroku 文档:https ://devcenter.heroku.com/articles/dynos#ephemeral-filesystem
因此,写入“文件系统”的任何文件都是临时的。
这为这个问题提供了一个非常简单的解决方案:您可以简单地使用 NodeJS 文件系统操作在服务器上创建临时文件,提供一次(或在有限的时间内),然后删除它们,这样它们就不能再次下载了。
这与类似的东西相结合$.download()
将提供无缝体验,从而防止未经授权的下载。
示例代码很快
除了使用router
包
在 Meteor.startup 你可以添加
var require = __meteor_bootstrap__.require;
fs = require( 'fs' );
该fs
变量应仅在服务器上声明。fs 包是 Meteor 使用的,不需要单独添加。
完成此操作后,您可以创建Meteor.uuid()
名称为文件的文件,这使它们独一无二且难以猜测。也可以通过使用在一定时间后删除文件Meteor.setTimeout
问题是:要下载的文件从哪里来?