2017-02-20 2 views
-1

の終了後にそれらを削除する:1)ブラウザにlocalhost:3000/#/filesを入力開くことができる一時的なテキストファイルを作成しますby localhost:3000/#/{FILE_ID}.txt; 2)ブラウザを閉じると、一時ファイルが削除されます。は正しい場所に一時ファイルを生成して、私はMEANスタックの私のサーバーに機能を追加したいセッション

このため、私はnode-tmpを使用しようと、いくつかのコード書きました:バックエンドでは

app.config(['$stateProvider', function ($stateProvider) { 
    $stateProvider 
     .state('files', { 
      url: '/files', 
      template: "Hello World", 
      controller: 'FilesCtrl' 
     }) 
}]); 

app.controller('FilesCtrl', ['$http', function ($http) { 
    $http.post('/createFiles', null, null); 
}]) 

:フロントエンドで

をとして

router.post('/createFiles', function (req, res, next) { 
    var tmp = require('tmp'); 
    var fs = require('fs'); 
    tmp.file({ prefix: 'projectA-', postfix: '.txt' }, function (err, path, fd) { 
     if (err) throw err; 
     console.log("File: ", path); 
     console.log("Filedescriptor: ", fd); 
     fs.writeFileSync(path, "Hello world!") 
    }); 
}); 

をその結果は、ブラウザでlocalhost:3000/#/filesを入力すると、ファイル/var/folders/fn/0rmvqqbs4k76lg5g6b7kll100000gn/T/projectA-40926BSynm5PKdMmW.txtを作成していますが、ブラウザのタブを閉じると、このファイルは削除されません。

私は右のライブラリを使用していますか?もしそうなら、どのようにして1)tmpファイルをlocalhost:3000/#/{FILE_ID}.txtに置くことができるのか誰にでも分かります。 2)セッションの終了後に系統的に削除しますか?

答えて

0

が、ブラウザのタブを閉じると、このファイルは削除されません。

ブラウザウィンドウを閉じると、通常、ブラウザウィンドウが閉じられたというサーバーサイドの通知は表示されません。

  1. サーバー側のセッションをセッションタイムアウトで:

    は、開発者が回避策この様々な方法があります。タイムアウトを使用してサーバー側のセッションオブジェクトを作成し、作成したファイルを特定のセッションに関連付けます。そのセッションを所有していない人が一定の時間内にサイトにアクセスしたことがないためにセッションタイムアウトが切れると、そのセッションに格納されているファイルを削除します。接続したときに

  2. のWebSocket接続を監視します。クライアントからサーバーへのwebSocket接続を使用して、Webページがまだ接続されているときにサーバーが監視できるようにします。ブラウザページが閉じられたときにwebSocketが切断されるため、そのイベントをサーバ上で使用して、そのセッションに関連するファイルのクリアをトリガすることができます。サイト内のあるページから別のページに移動するだけで、webSocketの終了と再オープンがトリガーされるので、ここでもタイムアウトを使用する必要があります。 WebSocketがユーザーによって閉じられていて短時間で再オープンされない場合、ユーザーはそのブラウザウィンドウを閉じたか、他のサイトに移動したとみなすことができます。

  3. 毎時クリーンアップ処理。作成された日時に基づいて一時ファイルを老化させる何らかの反復クリーンアッププロセスを使用します。ここでは、毎時間setInterval()にある機能を実行して、X時間以上前に作成された一時ファイルをチェックして削除することができます。

tmpファイルがローカルホストに配置されてみましょう:3000 /#/ {FILE_IDは}

を.txtでそれはあなたがここに欲しいまさに不明です。 http://localhost:3000/#/ {FILE_ID}です。txtはファイルシステム内の場所ではありません。これは、サーバに直接渡されることのないハッシュロケーションを使用するURLです。そのURLを使用するには、{FILE_ID}.txtを解析して何かをしたクライアントコードを用意しなければなりません(おそらくこれをAjax呼び出しに入れます)。

Expressを使用すると、URL内の何かを見て適切なテンポラリファイルを提供する汎用エクスプレスリクエストハンドラがあります。テンポラリファイルをファイルシステムに置く場所は決まっています(これはあなた次第です)。あなたは、ファイルをそこに置くコードと要求からそれらを提供するコードが同じ場所を使用していることを確認するだけです。

たとえば、あなたがファイルを使用できる1つのURLスキームは、このようなものです。そして、

http://localhost:3000/file/{FILE_ID} 

、あなたがこのようなExpressのハンドラを作ることができる:

app.get('/file/:fileID', function(req, res) { 
    let fileID = req.params.fileID; 
    res.sendFile(path.join(__dirname, "tempFiles", fileID), {dotfiles: "deny"}); 
}); 
+0

申し訳ありませんが、私は私が作ったと思いますOP:localhost:3000 /#/ {FILE_ID} .txt'を開くことはそれほど重要ではないはずです。私はこれらのファイルを外部から開くことができるように、 "the_folder_of_my_site \ tmp_txt \"というサブフォルダに配置したいだけです。とにかく、これを無視してください... – SoftTimur

+0

'node-tmp'は正しいライブラリですか?切断後にファイルの生成と削除の両方を管理する既存のライブラリはありませんか? – SoftTimur

+0

@SoftTimur - ドキュメント 'node-temp'を見てもわかるように、一意の名前のテンポラリファイルを作成するための完全な細かい機能を提供しますが、特定のクライアントが接続されなくなったときにクリーンアップする機能はありません。クリーンアップメソッドは、node.jsプロセスが終了したときに関連するように見えます。特定のクライアントの接続が切断されたときにクリーンアップを追加する方法については、私の回答を参照してください。 – jfriend00

関連する問題