1

在 Meteor 中,是否有可以放置不会发送给客户端的 .zip 的文件夹?

第二个问题:如何在应用程序上制作临时下载链接,一段时间后会自毁?

这个想法是只有服务器才能访问这个文件。/server似乎不起作用,因为我放置在那里的任何不是代码的文件都不包含在最终包中。

4

1 回答 1

2

我的解决方案 - Heroku 文件系统

这可能不是解决此问题的最佳方法 - 但是,对于需要将文件与应用程序捆绑在一起而客户端无法看到的其他任何人,这就是我的做法。

请注意,删除安全文件已完成,因为 Heroku 不会在重新启动时保留文件系统更改

  • 将文件放在文件夹中名为“securefiles”或类似文件夹的/public文件夹中。
  • 这些被编译到/static包中命名的文件夹中。请注意,如果您使用的是 Heroku buildpack,则服务器工作目录的实际路径是/app/.meteor/heroku_build/app/.
  • 接下来,在服务器启动时,检测应用程序是否已捆绑。您可以通过检查static文件夹的存在来做到这一点,并且可能还有其他文件是捆绑包独有的。
  • 如果您被捆绑,请使用ncp. 我为此目的制作了一个陨石包,用于mrt add ncp将节点复制工具添加到您的项目中。我建议复制到应用程序的根目录,因为这对客户端不可见。
  • 接下来,从static.

此时,您拥有只能由服务器访问的文件。这是一些示例咖啡脚本来做到这一点:

Meteor.startup ->
   fs = __meteor_bootstrap__.require 'fs'

   bundled = fs.existsSync '/app' #Checking /app because on heroku app is stored in root / app
   rootDir = if bundled then "/app/.meteor/heroku_build/app/" else "" #Not sure how to get the path to the root directory on a local build, this is a bug
   if fs.existsSync rootDir+"securefiles"
       rmDir rootDir+"securefiles"
   #Do the same with any other temporary folders you want to get rid of on startup

   #now copy out the secure files
   ncp rootDor+'static/securefiles', rootDir+'securefiles', ()->
       rmdir rootDir+'static/securefiles' if bundled

安全/临时文件下载

请注意,此代码依赖于random包和我的包ncp

正如我在我的项目中所做的那样,添加到这个系统以支持临时文件下载非常容易。以下是如何运行url = setupDownload("somefile.rar", 30)以创建临时文件下载链接。

setupDownload = (dlname, timeout) ->
    if !timeout?
        timeout = 30
    file = rootDir+'securefiles/'+dlname
    return '' if !fs.existsSync file
    dlFolder = rootDir+'static/dls'
    fs.mkdirSync dlFolder if !fs.existsSync dlFolder
    dlName = Random.id()+'.rar' #Possible improvement: detect file extension
    dlPath = dlFolder+'/'+dlName
    ncp file, dlPath, () ->
        Fiber(()->
            Meteor.setTimeout(() ->
                fs.unlink dlPath
            , 1000*timeout)
        ).run()
    "/dls/"+dlName

也许我会为此做一个包。让我知道你是否可以使用类似的东西。

于 2013-03-25T16:36:14.183 回答