在Meteor中,是否有任何文件夹我可以将.zip 发送给客户端?
次要问题:如何在应用上制作临时下载链接,经过一段时间后会自毁?
这个想法是只有服务器才能访问这个文件。 /server
似乎不起作用,因为我放在那里的非代码的任何文件都不包含在最终的包中。
答案 0 :(得分:2)
这可能不是解决此问题的最佳解决方案 - 但是,对于需要与应用程序捆绑在一起且客户端无法看到的文件的任何其他人,我就是这样做的。
请注意,删除安全文件是,因为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
也许我会为此制作一个包裹。如果你能使用类似的东西,请告诉我。