2017-02-20 42 views
-1

我想在我的服務器中添加一個功能: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)在會議結束後系統地刪除它?

回答

0

但關閉瀏覽器選項卡不會刪除此文件。

關閉瀏覽器窗口通常不會給你任何關於瀏覽器窗口關閉的服務器端通知。

有跡象表明,開發人員的工作,解決此不同的方式:

  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

相關問題