在正确的地方生成临时文件并在会话结束后删除它们

问题描述:

我想在我的服务器中添加一个功能: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)在会议结束后系统地删除它?

但关闭浏览器选项卡不会删除此文件。

关闭浏览器窗口通常不会给你任何关于浏览器窗口关闭的服务器端通知。

有迹象表明,开发人员的工作,解决此不同的方式:

  1. 服务器端会话与会话超时。使用超时创建服务器端会话对象,并将所有创建的文件与特定会话相关联。当会话超时到期时,因为拥有该会话的任何人在一段时间内未访问过该站点,则删除存储在该会话中的名为的文件。

  2. WebSocket连接到连接时进行监视。使用从客户端到服务器的webSocket连接,允许服务器监视网页何时连接。由于在浏览器页面关闭时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中的某些内容,然后提供相应的临时文件。您可以决定将临时文件放入文件系统的位置(完全取决于您)。您只需确保放置文件的代码和从请求提供的代码使用相同的位置即可。

例如,你可以使用的文件的一个URL方案是这样的:

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

然后,你可以做一个快速的处理程序是这样的:

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