在合适的地方生成临时文件,会话结束后删除

Generate temporary files in the right place and delete them after the end of the session

我想在我的 MEAN 堆栈服务器中添加一个功能:1) 在浏览器中输入 localhost:3000/#/files 将创建一个临时文本文件,可以通过 localhost:3000/#/{FILE_ID}.txt 打开该文件; 2) 关闭浏览器会删除临时文件。

为此,我尝试使用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)会话结束后系统删除?

but closing the browser tab does NOT delete this file.

关闭浏览器 window 通常不会向您提供任何类型的服务器端通知,告知您浏览器 window 已关闭。

开发人员可以通过多种方式 work-around 这:

  1. Server-side session session 超时。 创建一个 server-side session object 超时并将任何创建的文件与特定的 session 相关联。当 session 超时到期时,因为拥有 session 的人在一段时间内没有访问该站点,然后删除存储在 session.

    中的命名文件
  2. WebSocket 连接在连接时进行监控。 使用从客户端到服务器的 webSocket 连接以允许您的服务器在网页仍处于连接状态时进行监控。由于当浏览器页面关闭时,webSocket 将断开连接,因此您可以在服务器上使用该事件来触发与该 session 关联的文件的清除。请注意,仅在站点内从一个页面导航到另一个页面也会触发 webSocket 的关闭然后重新打开,因此您还必须在此处使用超时。如果 webSocket 被用户关闭,然后在短时间内没有重新打开,您可以假设用户已关闭该浏览器 window 或导航到其他站点。

  3. 每小时清理一次。 使用某种定期清理进程,根据创建的 date/time 临时文件老化。在这里,您可以每小时在 setInterval() 上 运行 一些函数来检查 X 小时前创建的临时文件并删除它们。

let the tmp file be placed in localhost:3000/#/{FILE_ID}.txt

不清楚您到底想要什么。 http://localhost:3000/#/{FILE_ID}.txt 不是您文件系统中的位置。它是一个 URL,它使用了一个甚至不会直接传递给服务器的散列​​位置。为了使用那个 URL,你必须有一些客户端代码来解析 {FILE_ID}.txt 然后用它做一些事情(也许把它放在一个 Ajax 调用中)。

使用 Express,这样的工作方式是您将拥有某种通用的快速请求处理程序,它会查看 URL 中的内容,然后提供适当的临时文件。您可以决定将临时文件放在文件系统中的什么位置(这完全取决于您)。您只需确保将文件放在那里的代码和从请求中提供文件的代码使用相同的位置。

例如,您可以为文件使用的一个 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"});
});