Meteor Server-Only文件和临时下载

时间:2013-03-24 17:48:05

标签: filesystems meteor

在Meteor中,是否有任何文件夹我可以将.zip 发送给客户端?

次要问题:如何在应用上制作临时下载链接,经过一段时间后会自毁?

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

1 个答案:

答案 0 :(得分:2)

我的解决方案 - Heroku Filesystem

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

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

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

此时您拥有只能由服务器访问的文件。这里有一些样本coffeescript:

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

也许我会为此制作一个包裹。如果你能使用类似的东西,请告诉我。