Je crée une fonction de téléchargement de fichier dans node.js avec Express 3.
Je voudrais saisir l'extension de fichier de l'image. je peux donc renommer le fichier, puis lui ajouter l’extension de fichier.
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);
});
Comment puis-je obtenir l'extension de l'image dans node.js?
Je crois que vous pouvez faire ce qui suit pour obtenir l’extension d’un nom de fichier.
var path = require('path')
path.extname('index.html')
// returns
'.html'
Mettre à jour
Depuis la réponse d'origine, extname () a été ajouté au module path
, voir la réponse de Snowfish
Réponse originale:
J'utilise cette fonction pour obtenir une extension de fichier, parce que je n'ai pas trouvé le moyen de le faire plus facilement (mais je pense qu'il y en a une):
function getExtension(filename) {
var ext = path.extname(filename||'').split('.');
return ext[ext.length - 1];
}
vous devez avoir besoin de 'path' pour l'utiliser.
une autre méthode qui n'utilise pas le module de chemin:
function getExtension(filename) {
var i = filename.lastIndexOf('.');
return (i < 0) ? '' : filename.substr(i);
}
// you can send full url here
function getExtension(filename) {
return filename.split('.').pop();
}
Si vous utilisez express, veuillez ajouter la ligne suivante lors de la configuration d'un middleware (bodyParser)
app.use(express.bodyParser({ keepExtensions: true}));
Cette solution prend en charge les chaînes de requête!
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'
Il est beaucoup plus efficace d'utiliser la méthode substr()
au lieu de split()
& pop()
Regardez les différences de performances ici: http://jsperf.com/remove-first-character-from-string
// returns: 'html'
var path = require('path');
path.extname('index.html').substr(1);
Mise à jour août 2019 Comme l'a souligné @xentek dans les commentaires; substr()
est maintenant considéré comme une fonction héritée ( documentation MDN ). Vous pouvez utiliser substring()
à la place. La différence entre substr()
et substring()
réside dans le fait que le deuxième argument de substr()
correspond à la longueur maximale à renvoyer, tandis que le second argument de substring()
correspond à l'index sur lequel s'arrêter (sans inclure ce personnage). De plus, substr()
accepte les positions de départ négatives à utiliser comme décalage par rapport à la fin de la chaîne, tandis que substring()
ne le fait pas.
Une solution simple, sans besoin de require, qui résout le problème de l'extension des périodes multiples:
var filename = 'file.with.long.extension';
var ext = filename.substring(filename.indexOf('.'));
//ext = '.with.long.extension'
Ou si vous ne voulez pas le point principal:
var filename = 'file.with.long.extension';
var ext = filename.substring(filename.indexOf('.')+1);
//ext = 'with.long.extension'
Assurez-vous de vérifier que le fichier a aussi une extension.
Je pense que le mappage de l'en-tête Content-Type dans la demande fonctionnera également. Cela fonctionnera même dans les cas où vous téléchargez un fichier sans extension. (quand le nom de fichier n'a pas d'extension dans la requête)
Supposons que vous envoyez vos données via 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--
Ici, l'en-tête name-type contient le type mime des données. En mappant ce type MIME sur une extension, vous obtiendrez l'extension de fichier :).
Restify BodyParser convertit cet en-tête en une propriété avec le nom type
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 }
}
Vous pouvez utiliser cet en-tête et faire le mappage d'extension (sous-chaîne, etc.) manuellement, mais il existe également des bibliothèques prêtes à l'emploi pour cela. Au-dessous de deux étaient les meilleurs résultats quand j'ai fait une recherche sur Google
et leur utilisation est aussi simple:
app.post('/upload2', function (req, res) {
console.log(mime.extension(req.files.image.type));
}
l'extrait ci-dessus sera imprimé png sur la console.
var fileName = req.files.upload.name;
var arr = fileName.split('.');
var extension = arr[length-1];
path.extname
fera l'affaire dans la plupart des cas. Cependant, tout ce qui suit le dernier .
, y compris la chaîne de requête et le fragment de hachage d'une requête http, sera inclus:
var path = require('path')
var extname = path.extname('index.html?username=asdf')
// extname contains '.html?username=asdf'
Dans de tels cas, vous voudrez peut-être essayer quelque chose comme ceci:
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'
Notez que les extensions avec plusieurs périodes (telles que .tar.gz
) ne fonctionneront pas du tout avec path.extname
.
La fonction suivante divise la chaîne et renvoie le nom et l'extension, quel que soit le nombre de points de l'extension. Il retourne une chaîne vide pour l'extension s'il n'y en a pas. Les noms commençant par des points et/ou des espaces fonctionnent également.
function basext(name) {
name = name.trim()
const match = name.match(/^(\.+)/)
let prefix = ''
if (match) {
prefix = match[0]
name = name.replace(prefix, '')
}
const index = name.indexOf('.')
const ext = name.substring(index + 1)
const base = name.substring(0, index) || ext
return [prefix + base, base === ext ? '' : ext]
}
const [base, ext] = basext('hello.txt')