2012-05-03 19 views
17

Potrzebuję uzyskać typ pliku pliku za pomocą pliku node.js, aby ustawić typ zawartości. Wiem, że mogę łatwo sprawdzić rozszerzenie pliku, ale mam również pliki bez rozszerzenia, które powinny mieć zawartość typu: image/png, text/html aso.Node.js - System plików pobierz typ pliku

To jest mój kod (wiem, że to nie ma sensu, ale to podstawa Muszę):

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); 

nie znalazłem funkcję za to w API więc byłbym szczęśliwy jeśli ktoś może mi powiedzieć, jak to zrobić.

+6

'readFileSync' na każdym żądaniu? Nie brzmi to jak dobry pomysł ... – ThiefMaster

+3

@ ThiefMaster Jak powiedział, jest to tylko fałszywy kod (przynajmniej tak myślę "Wiem, że to nie ma większego sensu, ale to jest baza, której potrzebuję" znaczyć). –

Odpowiedz

14

Wystarczy popatrzeć na mmmagic module. Jest to bindowanie libmagiczne i wydaje się, że robi dokładnie to, co chcesz.

+3

Zakładając' fs.stat' robi to co 'stat': Jak dokładnie każda z informacji, które otrzymasz, pomoże mu określić typ MIME plik? – ThiefMaster

+1

Nie wiem, przypuszczam, że powiedziałoby ci coś pożytecznego: P – Raynos

+8

@Raynos: widząc jak nie masz pojęcia, dlaczego nawet powiedziałeś? To jest najlepsza odpowiedź. – Ashe

10

Powinieneś rzucić okiem na narzędzie wiersza poleceń file (Linux). Próbuje odgadnąć typ pliku na podstawie pierwszych kilku bajtów pliku. Możesz użyć child_process.spawn, aby uruchomić go z poziomu węzła.

5

Chcesz być patrząc typ MIME, i na szczęście węzeł posiada wygodny biblioteki tylko dla tego:

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

edit:

Powinieneś chyba zajrzeć do statycznego serwera aktywów i nie ustawiaj żadnego z tych rzeczy sam. Możesz to zrobić w łatwy sposób, lub istnieje cały szereg statycznych modułów plików, np. ecstatic. Z drugiej strony powinieneś prawdopodobnie używać nginx do wyświetlania statycznych plików.

+5

W zależności od tego, co chce zrobić, uzyskanie typu na podstawie nazwy pliku może nie być najlepszym pomysłem. – ThiefMaster

+0

Ahh tak, zgodzili się. – timoxley

24

Jest biblioteka pomocnik dla patrząc typy MIME https://github.com/broofa/node-mime

var mime = require('mime'); 

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

Ale to nadal używa rozszerzenie dla odnośnika chociaż

+2

Właściwie ta biblioteka jest bardzo przyjemna, ale ponieważ ThiefMaster skomentował odpowiedź timeoxly'a, bazuje ona na rozszerzeniu pliku, aby pobrać pliki bez rozszerzenia. – noob

+0

Myślę, że twój link jest zepsuty ..... – starbeamrainbowlabs

+0

'npm install mime' –