1

Meteorに、クライアントに送信されない.zipを配置できるフォルダーはありますか?

二次的な質問:アプリに一時的なダウンロードリンクを作成するにはどうすればよいですか?一定期間後に自己破壊しますか?

サーバーだけがこのファイルにアクセスできるという考え方です。/serverコードではないファイルをそこに配置すると、最終的なバンドルに含まれないため、機能しないようです。

4

1 に答える 1

2

私のソリューション-Herokuファイルシステム

これはおそらくこの問題の最善の解決策ではありませんが、クライアントに表示されないファイルをアプリにバンドルする必要がある他の人にとっては、これが私がそれを行った方法です。

Herokuは再起動時にファイルシステムの変更を保持しないため、セキュアファイルの削除が行われることに注意してください。

  • フォルダ内の「securefiles」などの名前のフォルダにファイルを配置し/publicます。
  • /staticこれらは、バンドルで指定されたフォルダーにコンパイルされます。Herokuビルドパックを使用している場合、サーバーの作業ディレクトリへの実際のパスはです/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 に答える