2012-05-03 41 views
17

我需要藉助node.js來獲取文件的文件類型以設置內容類型。我知道我可以很容易地檢查文件擴展名,但我也有沒有擴展名的文件,其內容類型應該是image/png,text/html aso。Node.js - 文件系統獲取文件類型

這是我的代碼(我知道這並沒有太大的意義,但是這就是我需要的基礎):

var http = require("http"), 
    fs = require("fs"); 
http.createServer(function(req, res) { 
    var data = ""; 
    try { 
     /* 
     * Do not use this code! 
     * It's not async and it has a security issue. 
     * The code style is also bad. 
     */ 
     data = fs.readFileSync("/home/path/to/folder" + req.url); 
     var type = "???"; // how to get the file type?? 
     res.writeHead(200, {"Content-Type": type}); 
    } catch(e) { 
     data = "404 Not Found"; 
     res.writeHead(404, {"Content-Type": "text/plain"}); 
    } 
    res.write(data); 
    res.end(); 
}).listen(7000); 

我還沒有找到一個函數,該函數在API,所以我會很高興如果有人能告訴我該怎麼做。

+6

'readFileSync' on每個請求?聽起來不是一個好主意...... – ThiefMaster

+3

@ThiefMaster正如他所說,這只是虛擬代碼(至少這就是我認爲的「我知道這並沒有多大的意義,但這是我需要的基礎」意思是)。 –

回答

14

看一看的​​。這是一種libmagic綁定,似乎正是你想要的。

+3

假設'fs.stat'確實做了'stat'的工作:你得到的任何信息如何幫助他確定MIME類型文件? – ThiefMaster

+1

我實際上並不知道,我猜想它會告訴你一些有用的信息:P – Raynos

+8

@Raynos:看到你不知道,你爲什麼要評論?這是最好的答案。 – Ashe

10

你應該看看命令行工具file(Linux)。它試圖根據文件的前幾個字節猜測文件類型。您可以使用child_process.spawn從節點內運行它。

5

你想被仰視的MIME類型,幸好節點只是一個方便的庫:

https://github.com/bentomas/node-mime#readme

編輯:

你或許應該尋找到一個靜態的資產服務器不要自己設置這些東西。您可以使用express輕鬆完成此操作,或者有大量靜態文件模塊,例如ecstatic。另一方面,你應該使用nginx來提供靜態文件。

+5

根據他想要做什麼獲得基於文件名的類型可能不是最好的主意。 – ThiefMaster

+0

啊,是的,同意了。 – timoxley

24

有一個輔助庫查找MIME類型https://github.com/broofa/node-mime

var mime = require('mime'); 

mime.lookup('/path/to/file.txt');   // => 'text/plain' 

但它仍然採用了擴展查找雖然

+2

其實這個庫是非常好的,但作爲ThiefMaster評論timeoxly的答案它是基於文件擴展名,所以它會下載文件沒有擴展名。 – noob

+0

我認爲你的鏈接壞了...... – starbeamrainbowlabs

+0

'npm install mime' –

相關問題