2012-06-02 38 views
115

Tworzę funkcję przesyłania plików w pliku node.js z wyrażeniem 3.Node.js pobierz rozszerzenie pliku

Chciałbym pobrać rozszerzenie pliku obrazu. więc mogę zmienić nazwę pliku, a następnie dołączyć do niego rozszerzenie pliku.

app.post('/upload', function(req, res, next) { 
    var is = fs.createReadStream(req.files.upload.path), 
     fileExt = >>>> I want to get the extension of the image here <<<<, 
     os = fs.createWriteStream('public/images/users/' + req.session.adress + '.' + fileExt); 
}); 

Jak mogę uzyskać rozszerzenie obrazu w pliku node.js?

+0

http://stackoverflow.com/questions/10431845/node-js-file-system-get-file-type repeat? –

+1

Czy to nie jest pytanie o typy mime, chcę, aby rozszerzenie pliku – georgesamper

+1

@Jojje zdecydować. Tytuł * i * treść pytania wymagają sposobu rozpoznania pliku * typ *. Więc jaki jest dokładnie twój problem? Pokaż nam kod, powiedz, czego oczekujesz i co robi. –

Odpowiedz

270

wierzę, można wykonać następujące czynności, aby uzyskać rozszerzenie nazwy pliku.

var path = require('path') 

path.extname('index.html') 
// returns 
'.html' 
+26

Tylko uważaj, pobierze tylko znaki po ostatniej kropce, więc nazwy plików takie jak 'app.css.gz' zwrócą tylko'. gz' a nie '.css.gz', które mogą być lub nie być tym, co chcesz. – xentek

+9

W takim przypadku po prostu użyj 'filename.split ('.'). Pop();' –

+7

@AamirAfridi Zwraca ten sam ciąg bez ".". – undefined

28

używam tej funkcji, aby uzyskać rozszerzenie pliku, bo nie znaleźć sposób, aby to zrobić w prostszy sposób (ale myślę, że jest):

function getExtension(filename) { 
    var ext = path.extname(filename||'').split('.'); 
    return ext[ext.length - 1]; 
} 

należy wymagać " ścieżka ", aby go użyć.

inna metoda, która nie korzysta z modułu ścieżki:

function getExtension(filename) { 
    var i = filename.lastIndexOf('.'); 
    return (i < 0) ? '' : filename.substr(i); 
} 
+2

Tak, to działa. Pomyślałem, że łatwiej będzie użyć węzła. Oto, co zrobiłem: 'var is = fs.createReadStream (req.files.upload.path), fileType = is.path.split (/ [.] + /). Pop();' – georgesamper

+5

Powinieneś po prostu użyć moduł ścieżki, jak zauważyła odpowiedź @ Snowfish, i nie zapisuj własnego. Więcej informacji: http://nodejs.org/api/path.html#path_path_extname_p – xentek

15
// you can send full url here 
function getExtension(filename) { 
    return filename.split('.').pop(); 
} 

Jeśli używasz express należy dodać następującą linię podczas konfigurowania oprogramowania pośredniczącego (bodyParser)

app.use(express.bodyParser({ keepExtensions: true})); 
0

path.extname zrobi to w większości przypadków. Jednak będzie on zawierał wszystko po ostatnim ., w tym ciąg kwerendy i mieszania fragmentu żądania http:

var path = require('path') 
var extname = path.extname('index.html?username=asdf') 
// extname contains '.html?username=asdf' 

w takich przypadkach, będziesz chciał spróbować czegoś takiego:

var regex = /[#\\?]/g; // regex of illegal extension characters 
var extname = path.extname('index.html?username=asdf'); 
var endOfExt = extname.search(regex); 
if (endOfExt > -1) { 
    extname = extname.substring(0, endOfExt); 
} 
// extname contains '.html' 

Należy pamiętać, że rozszerzenia z wieloma okresami (np. .tar.gz) nie będą działały w ogóle z path.extname.

1
var fileName = req.files.upload.name; 

var arr = fileName.split('.'); 

var extension = arr[length-1]; 
+0

gdzie jest zmienna długości pochodzi? –

+1

Spróbuj dodać wyjaśnienie do swojej odpowiedzi. W ten sposób PO może rzeczywiście zrozumieć, co zrobiłeś i dlaczego to zrobiłeś. W ten sposób OP może uczyć się na podstawie Twojej odpowiedzi, a nie tylko kopiować/wklejać. – Oldskool

5

Prostym rozwiązaniem bez konieczności wymagać która rozwiązuje wiele problemów przedłużający okres:

var filename = 'file.with.long.extension'; 
var ext = filename.substring(filename.indexOf('.')); 
//ext = '.with.long.extension' 

Lub jeśli nie chcesz kropką:

var filename = 'file.with.long.extension'; 
var ext = filename.substring(filename.indexOf('.')+1); 
//ext = 'with.long.extension' 

upewnij się, sprawdź, czy plik ma również rozszerzenie.

8

To rozwiązanie obsługuje querystrings!

var Url = require('url'); 
var Path = require('path'); 

var url = 'http://i.imgur.com/Mvv4bx8.jpg?querystring=true'; 
var result = Path.extname(Url.parse(url).pathname); // '.jpg' 
+0

Co jeśli nazwa pliku to 'Mvv4bx8.something.else.jpg' –

+0

#Aamir Afridi nadal działa – user956584

2

Myślę, że mapowanie nagłówka Content-Type w żądaniu również zadziała.To zadziała nawet w przypadku, gdy prześlesz plik bez rozszerzenia. (gdy nazwa pliku nie ma rozszerzenia w żądaniu)

Załóżmy, że wysyłanie danych za pomocą protokołu HTTP POST:

POST /upload2 HTTP/1.1 
Host: localhost:7098 
Connection: keep-alive 
Content-Length: 1047799 
Accept: */* 
Origin: http://localhost:63342 
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36 
Content-Type: multipart/form-data; boundary=---- WebKitFormBoundaryPDULZN8DYK3VppPp 
Referer: http://localhost:63342/Admin/index.html? _ijt=3a6a054pasorvrljf8t8ea0j4h 
Accept-Encoding: gzip, deflate 
Accept-Language: en-US,en;q=0.8,az;q=0.6,tr;q=0.4 
Request Payload 
------WebKitFormBoundaryPDULZN8DYK3VppPp 
Content-Disposition: form-data; name="image"; filename="blob" 
Content-Type: image/png 


------WebKitFormBoundaryPDULZN8DYK3VppPp-- 

Tutaj nazwa nagłówka Content-Type zawiera typ MIME danych. Odwzorowanie tego typu MIME na rozszerzenie spowoduje rozszerzenie pliku :).

Restify BodyParser konwertuje ten nagłówek do właściwości z nazwą typu

File { 
    domain: 
    Domain { 
    domain: null, 
    _events: { .... }, 
    _eventsCount: 1, 
    _maxListeners: undefined, 
    members: [ ... ] }, 
    _events: {}, 
    _eventsCount: 0, 
    _maxListeners: undefined, 
    size: 1047621, 
    path: '/tmp/upload_2a4ac9ef22f7156180d369162ef08cb8', 
    name: 'blob', 
    **type: 'image/png'**, 
    hash: null, 
    lastModifiedDate: Wed Jul 20 2016 16:12:21 GMT+0300 (EEST), 
    _writeStream: 
    WriteStream { 
    ... }, 
    writable: true, 
    domain: 
    Domain { 
     ... 
    }, 
     _events: {}, 
     _eventsCount: 0, 
    _maxListeners: undefined, 
    path: '/tmp/upload_2a4ac9ef22f7156180d369162ef08cb8', 
    fd: null, 
    flags: 'w', 
    mode: 438, 
    start: undefined, 
    pos: undefined, 
    bytesWritten: 1047621, 
    closed: true } 
} 

Można użyć tego nagłówka i zrobić mapowanie przedłużacza (podciąg etc ...) ręcznie, ale są też gotowe biblioteki do tego. Poniżej dwa były najlepsze wyniki, gdy zrobiłem wyszukiwania google

  • mim
  • typy MIME

a ich użycie jest proste, jak dobrze:

app.post('/upload2', function (req, res) { 
    console.log(mime.extension(req.files.image.type)); 
} 

powyższy fragment wydrukuje png do konsoli.