Lorsqu'un utilisateur sélectionne un fichier dans une page Web, je veux pouvoir extraire uniquement le nom du fichier.
J'ai essayé la fonction str.search mais elle semble échouer lorsque le nom du fichier ressemble à ceci: c:\uploads\ilike.this.file.jpg .
Comment pouvons-nous extraire uniquement le nom du fichier sans extension?
En supposant que votre <input type = "fichier"> ait un identifiant de upload cela devrait faire l'affaire, espérons-le
var fullPath = document.getElementById('upload').value;
if (fullPath) {
var startIndex = (fullPath.indexOf('\\') >= 0 ? fullPath.lastIndexOf('\\') : fullPath.lastIndexOf('/'));
var filename = fullPath.substring(startIndex);
if (filename.indexOf('\\') === 0 || filename.indexOf('/') === 0) {
filename = filename.substring(1);
}
alert(filename);
}
Pour diviser la chaîne ({chemin du fichier}/{nom du fichier}) et obtenir le nom du fichier, vous pouvez utiliser quelque chose comme ceci:
str.split(/(\\|\/)/g).pop()
"La méthode pop supprime le dernier élément d'un tableau et renvoie la valeur À l'appelant." RÉSEAU DE DÉVELOPPEURS MOZILLA
Exemple:
à partir de: "/home/user/file.txt".split(/(\\|\/)/g).pop()
vous obtenez: "file.txt"
De nos jours, il existe un moyen beaucoup plus simple:
var fileInput = document.getElementById('upload');
var filename = fileInput.files[0].name;
Très simple
let file = $("#fileupload")[0].files[0];
file.name
En supposant:
<input type="file" name="file1" id="theFile">
Le JavaScript serait:
var fileName = document.getElementById('theFile').files[0].name;
var pieces = str.split('\\');
var filename = pieces[pieces.length-1];
Je viens de faire ma propre version de cela. Ma fonction peut être utilisée pour extraire ce que vous voulez, si vous n’avez pas besoin de tout, vous pouvez facilement supprimer du code.
<html>
<body>
<script type="text/javascript">
// Useful function to separate path name and extension from full path string
function pathToFile(str)
{
var nOffset = Math.max(0, Math.max(str.lastIndexOf('\\'), str.lastIndexOf('/')));
var eOffset = str.lastIndexOf('.');
if(eOffset < 0 && eOffset < nOffset)
{
eOffset = str.length;
}
return {isDirectory: eOffset === str.length, // Optionally: && nOffset+1 === str.length if trailing slash means dir, and otherwise always file
path: str.substring(0, nOffset),
name: str.substring(nOffset > 0 ? nOffset + 1 : nOffset, eOffset),
extension: str.substring(eOffset > 0 ? eOffset + 1 : eOffset, str.length)};
}
// Testing the function
var testcases = [
"C:\\blabla\\blaeobuaeu\\testcase1.jpeg",
"/tmp/blabla/testcase2.png",
"testcase3.htm",
"C:\\Testcase4", "/dir.with.dots/fileWithoutDots",
"/dir.with.dots/another.dir/"
];
for(var i=0;i<testcases.length;i++)
{
var file = pathToFile(testcases[i]);
document.write("- " + (file.isDirectory ? "Directory" : "File") + " with name '" + file.name + "' has extension: '" + file.extension + "' is in directory: '" + file.path + "'<br />");
}
</script>
</body>
</html>
Produira les éléments suivants:
Avec && nOffset+1 === str.length
ajouté à isDirectory
:
Étant donné les cas de test, vous pouvez voir que cette fonction fonctionne de manière assez robuste comparée aux autres méthodes proposées ici.
Remarque pour les débutants sur le caractère \\:\est un caractère d'échappement, par exemple\n signifie une nouvelle ligne et\t un onglet. Pour permettre l’écriture de\n, vous devez taper \\ n.
Je suppose que vous voulez effacer toutes les extensions, c'est-à-dire /tmp/test/somefile.tar.gz
à somefile
.
Approche directe avec regex:
var filename = filepath.match(/^.*?([^\\/.]*)[^\\/]*$/)[1];
Approche alternative avec opération de regex et tableau:
var filename = filepath.split(/[\\/]/g).pop().split('.')[0];
Entrée : C:\path\Filename.ext
Sortie : Filename
Dans le code HTML, définissez la valeur File onChange
comme ceci ...
<input type="file" name="formdata" id="formdata" onchange="setfilename(this.value)"/>
En supposant que votre identifiant de champ textuel soit 'wpName' ...
<input type="text" name="wpName" id="wpName">
JavaScript
<script>
function setfilename(val)
{
filename = val.split('\\').pop().split('/').pop();
filename = filename.substring(0, filename.lastIndexOf('.'));
document.getElementById('wpName').value = filename;
}
</script>
// HTML
<input type="file" onchange="getFileName(this)">
// JS
function getFileName(input) {
console.log(input.files[0].name) // With extension
console.log(input.files[0].name.replace(/\.[^/.]+$/, '')) // Without extension
}
Aucune des réponses très demandées ne fournit en réalité "juste le nom du fichier sans extension" et les autres solutions sont beaucoup trop de code pour un travail aussi simple.
Je pense que cela devrait être un one-line pour tout programmeur JavaScript. C'est une expression régulière très simple:
function basename(prevname) {
return prevname.replace(/^(.*[/\\])?/, '').replace(/(\.[^.]*)$/, '');
}
Commencez par effacer tout ce que vous voulez jusqu'à la dernière barre oblique.
Ensuite, dépouiller quoi que ce soit après la dernière période, le cas échéant.
C'est simple, c'est robuste, il met en œuvre exactement ce qui est demandé. Est-ce que je manque quelque chose?
Si vous utilisez jQuery alors
$("#fileupload").val();
Aucune des réponses ci-dessus n'a fonctionné pour moi, voici ma solution qui met à jour une entrée désactivée avec le nom de fichier:
<script type="text/javascript">
document.getElementById('img_name').onchange = function () {
var filePath = this.value;
if (filePath) {
var fileName = filePath.replace(/^.*?([^\\\/]*)$/, '$1');
document.getElementById('img_name_input').value = fileName;
}
};
</script>