2012-06-02 18 views
115

Im creazione di una funzione di caricamento di file in node.js con espresso 3.Node.js ottenere estensione del file

vorrei afferrare l'estensione del file di immagine. così posso rinominare il file e quindi aggiungere l'estensione del file ad esso.

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

Come posso ottenere l'estensione dell'immagine in node.js?

+0

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

+1

Non è questa la domanda sui tipi mime, voglio l'estensione del file – georgesamper

+1

@Jojje quindi decidi. Il titolo * e * il corpo della tua domanda richiede un modo per discernere il file * tipo *. Allora, qual è esattamente il tuo problema? Mostraci del codice, dicci cosa ti aspetti che faccia e cosa invece fa. –

risposta

270

credo che si può eseguire le seguenti operazioni per ottenere l'estensione di un nome di file.

var path = require('path') 

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

Basta fare attenzione, prenderà i caratteri solo dopo l'ultimo punto, quindi i nomi di file come 'app.css.gz' restituiranno solo'. gz' e non '.css.gz', che può o non può essere quello che vuoi. – xentek

+9

In questo caso, usa semplicemente 'filename.split ('.'). Pop();' –

+7

@AamirAfridi Restituisce la stessa stringa senza il '.'. – undefined

28

sto usando questa funzione per ottenere l'estensione del file, perché non ho trovato un modo per farlo in un modo più semplice (ma penso che ci sia):

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

dovrà richiedere ' percorso 'per usarlo.

un altro metodo che non utilizza il modulo di percorso:

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

Sì, questo funziona. Ho pensato che ci sarebbe stato un modo più semplice usando il nodo. Questo è quello che ho fatto: 'var is = fs.createReadStream (req.files.upload.path), fileType = is.path.split (/ [.] + /). Pop();' – georgesamper

+5

Dovresti davvero usare il modulo del percorso, come sottolineato dalla risposta di @ Snowfish, e non scrivere il tuo. Maggiori informazioni: 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(); 
} 

Se si utilizza espresso si prega di aggiungere la seguente riga quando si configura middleware (bodyParser)

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

path.extname farà il trucco nella maggior parte dei casi. Tuttavia, includerà tutto dopo l'ultima ., tra cui la stringa di query e hash frammento di una richiesta http:

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

In questi casi, ti consigliamo di provare qualcosa di simile:

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' 

Nota che le estensioni con più periodi (come .tar.gz) non funzioneranno affatto con path.extname.

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

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

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

dove si trova la variabile di lunghezza proviene? –

+1

Prova ad aggiungere qualche spiegazione alla tua risposta. In questo modo, l'OP può effettivamente capire cosa hai fatto e perché lo hai fatto. In questo modo l'OP può imparare dalla tua risposta, piuttosto che copiarla/incollarla. – Oldskool

5

Una soluzione semplice, senza necessità di richiedere che risolve il problema di estensione multipla periodo:

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

Oppure, se non si desidera che il punto iniziale:

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

Assicurarsi di verifica che il file abbia anche un'estensione.

8

Questa soluzione supporta 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

Cosa succede se il nome del file è 'Mvv4bx8.something.else.jpg' –

+0

#Aamir Afridi funziona ancora – user956584

2

Penso che mappare l'intestazione Content-Type nella richiesta funzionerà anche.Funzionerà anche per i casi in cui carichi un file senza estensione. (quando il nome del file non ha un'estensione nella richiesta)

Si supponga che si sta inviando i dati utilizzando 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-- 

qui Nome intestazione Content-Type contiene il tipo MIME dei dati. Mappando questo tipo mime ad un'estensione otterrai l'estensione del file :).

Restify BodyParser converte questa intestazione a una proprietà con nome tipo

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 } 
} 

È possibile utilizzare questa intestazione e fare la mappatura estensione (stringa ecc ...) manualmente, ma ci sono anche già pronti librerie per questo. Di seguito due erano i primi risultati quando ho fatto una ricerca su google

  • mimo
  • tipi MIME

e il loro utilizzo è semplice così:

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

sopra snippet stamperà png alla console.

Problemi correlati