2012-06-02 185 views
115

Im la creación de una función de carga de archivos en Node.js con expreso 3.Node.js obtener extensión de archivo

me gustaría agarrar la extensión de archivo de la imagen. entonces puedo renombrar el archivo y luego anexarle la extensión de archivo.

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

¿Cómo puedo obtener la extensión de la imagen en node.js?

+0

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

+1

No es esa la pregunta sobre mime-types, quiero la extensión de archivo – georgesamper

+1

@Jojje así que decídase. El título * y * el cuerpo de su pregunta pide una forma de discernir el archivo * tipo *. Entonces, ¿cuál es exactamente tu problema? Muéstranos un código, cuéntanos qué esperas que haga, y qué está haciendo en su lugar. –

Respuesta

270

Creo que se puede hacer lo siguiente para obtener la extensión del nombre de archivo.

var path = require('path') 

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

Solo tenga cuidado, solo captará los caracteres después del último punto, por lo que los nombres de archivo como 'app.css.gz' solo devolverán'. gz' y no '.css.gz', que pueden ser o no lo que quieres. – xentek

+9

En ese caso, simplemente use 'filename.split ('.'). Pop();' –

+7

@AamirAfridi Eso devuelve la misma cadena sin el '.'. – undefined

28

estoy usando esta función para obtener una extensión de archivo, porque no he encontrado una manera de hacerlo de una manera más fácil (pero creo que hay):

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

Debe exigir ' camino 'para usarlo.

otro método que no utiliza el módulo de ruta:

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

Sí, eso funciona. Solo pensé que habría una forma más fácil de usar el nodo. Esto es lo que hice: 'var is = fs.createReadStream (req.files.upload.path), fileType = is.path.split (/ [.] + /). Pop();' – georgesamper

+5

Realmente debería usar el módulo de ruta, como señaló la respuesta de @ Snowfish, y no el tuyo. Más información: 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(); 
} 

Si está utilizando expreso por favor añadir la siguiente línea al configurar el middleware (bodyParser)

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

path.extname hará el truco en la mayoría de los casos. Sin embargo, se incluirá todo después de la última ., incluyendo el fragmento de cadena de consulta y de hash de una petición http:

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

En tales casos, tendrá que probar algo como esto:

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' 

Tenga en cuenta que las extensiones con períodos múltiples (como .tar.gz) no funcionarán en absoluto con path.extname.

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

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

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

donde lo hace la variable de longitud viene de? –

+1

Intenta agregar alguna explicación a tu respuesta. De esta forma, el OP puede entender lo que hizo y por qué lo hizo. De esta forma, el OP puede aprender de su respuesta, en lugar de solo copiarla/pegarla. – Oldskool

5

Una solución sencilla y sin necesidad de requerir que resuelve el problema de la extensión múltiple periodo:

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

O si no desea que el punto inicial:

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

Asegúrese de prueba que el archivo tiene una extensión también.

8

¡Esta solución es compatible con 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

¿Qué pasa si el nombre del archivo es 'Mvv4bx8.something.else.jpg' –

+0

#Aamir Afridi sigue funcionando – user956584

2

Creo que el mapeo del encabezado Content-Type en la solicitud también funcionará.Esto funcionará incluso en los casos en que cargue un archivo sin extensión. (cuando el nombre de archivo no tiene una extensión en la solicitud)

Supongamos que está enviando sus datos a través de 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-- 

Aquí nombre de cabecera Content-Type contiene el tipo MIME de los datos. Al asignar este tipo de mímica a una extensión obtendrá la extensión de archivo :).

Restify BodyParser convierte esta cabecera en una propiedad con nombre 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 } 
} 

Puede utilizar esta cabecera y hacer la asignación de extensión (subcadena etc ...) de forma manual, pero también hay ya hecho bibliotecas para esto. A continuación dos eran los primeros resultados cuando hice una búsqueda en Google

  • mimo
  • tipos MIME

y su uso es simple también:

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

El fragmento de arriba imprimirá png en la consola.

Cuestiones relacionadas