Wenn ein Benutzer eine Datei auf einer Webseite auswählt, möchte ich nur den Dateinamen extrahieren können.
Ich habe die str.search-Funktion ausprobiert, aber es scheint fehlzuschlagen, wenn der Dateiname ungefähr wie folgt lautet: c:\uploads\ilike.this.file.jpg .
Wie können wir nur den Dateinamen ohne Erweiterung extrahieren?
Angenommen, Ihre <input type = "file"> hat eine ID von upload dies sollte hoffentlich den Trick tun:
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);
}
Um die Zeichenfolge ({Dateipfad}/{Dateiname}) zu teilen und den Dateinamen abzurufen, können Sie etwa Folgendes verwenden:
str.split(/(\\|\/)/g).pop()
Msgstr "Die pop - Methode entfernt das letzte Element aus einem Array und gibt diesen Wert an den Aufrufer zurück.". MOZILLA-ENTWICKLER-NETZWERK
Beispiel:
von: "/home/user/file.txt".split(/(\\|\/)/g).pop()
sie erhalten: "file.txt"
Heutzutage gibt es einen viel einfacheren Weg:
var fileInput = document.getElementById('upload');
var filename = fileInput.files[0].name;
Sehr einfach
let file = $("#fileupload")[0].files[0];
file.name
Vorausgesetzt:
<input type="file" name="file1" id="theFile">
Das JavaScript wäre:
var fileName = document.getElementById('theFile').files[0].name;
var pieces = str.split('\\');
var filename = pieces[pieces.length-1];
Ich habe gerade meine eigene Version davon gemacht. Meine Funktion kann verwendet werden, um das zu extrahieren, was Sie möchten. Wenn Sie nicht alles benötigen, können Sie leicht Code entfernen.
<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>
Wird folgendes ausgeben:
Wenn && nOffset+1 === str.length
zu isDirectory
hinzugefügt wurde:
Anhand der Testfälle sieht man, dass diese Funktion im Vergleich zu den anderen hier vorgeschlagenen Methoden recht robust ist.
Hinweis für Neueinsteiger über das \\:\ist ein Escape-Zeichen.\N bedeutet zum Beispiel eine Newline und\t eine Registerkarte. Um das Schreiben von\n zu ermöglichen, müssen Sie \\ n eingeben.
Ich gehe davon aus, dass Sie alle Erweiterungen entfernen möchten, d. H. /tmp/test/somefile.tar.gz
in somefile
.
Direkter Ansatz mit Regex:
var filename = filepath.match(/^.*?([^\\/.]*)[^\\/]*$/)[1];
Alternativer Ansatz mit Regex- und Array-Operation:
var filename = filepath.split(/[\\/]/g).pop().split('.')[0];
Eingabe: C:\path\Filename.ext
Ausgabe: Filename
Legen Sie im HTML-Code den Wert der Datei onChange
so fest ...
<input type="file" name="formdata" id="formdata" onchange="setfilename(this.value)"/>
Angenommen, Ihre Textfeld-ID lautet '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
}
Keine der hochbewerteten Antworten liefert tatsächlich "nur den Dateinamen ohne Erweiterung" und die anderen Lösungen sind viel zu viel Code für eine so einfache Aufgabe.
Ich denke, dies sollte ein Einzeiler für jeden JavaScript-Programmierer sein. Es ist ein sehr einfacher regulärer Ausdruck:
function basename(prevname) {
return prevname.replace(/^(.*[/\\])?/, '').replace(/(\.[^.]*)$/, '');
}
Streifen Sie zunächst alles bis zum letzten Schrägstrich ab, falls vorhanden.
Dann entfernen Sie alles nach der letzten Periode, falls vorhanden.
Es ist einfach, robust und implementiert genau das, was verlangt wird. Fehlt mir etwas?
Wenn Sie jQuery verwenden, dann
$("#fileupload").val();
Keine der obigen Antworten funktionierte für mich, hier ist meine Lösung, die eine deaktivierte Eingabe mit dem Dateinamen aktualisiert:
<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>