Testing File Upload Inputs

Как получить имя файла по полному пути, используя JavaScript?

Есть ли способ, чтобы я мог получить последнее значение (на основе символа «\» ) из полного пути? Пример: C:\Documents and Settings\img\recycled log.jpg В этом случае я просто хочу получить recycled log.jpg из полного пути в JavaScript.

18 ответов

var filename = fullPath.replace(/^.*[\\\/]/, '') 

Согласно этому сайту, использование replace намного медленнее, чем substr , который можно использовать вместе с lastIndexOf(‘/’)+1 : jsperf.com/replace-vs-substring

@nickf Ник, не уверен, где я ошибаюсь, но код не работает для меня, когда путь к файлу имеет одну косую черту. Fiddle , хотя для `\\` работает нормально.

@kooky A \ в строке JavaScript всегда создает символ экранирования, поэтому \n вставляет символ новой строки, и любой экранированный символ после его экранирования заменяется на символ. Следовательно, обратная косая черта в строке должна быть экранирована, если перед ней стоит другая обратная косая черта. Попробуйте это в этом JSFiddle . Вы должны были заметить , что выводимая строка не содержит какуюлибо обратную косую черты.

Я просто хотел найти соответствующую часть в строке с регулярным выражением, как показывает Нейт, но ваше решение настолько блестящее, я должен сказать вам спасибо. Вы просто удаляете все части перед символами \ или / вместо того, чтобы расположить вас в строке. Спасибо за вашу идею, даже она медленнее, чем решение Нейта.

Я только что запустил это на своей консоли, и он отлично работал для «/var/drop/foo/boo/moo.js».replace(/^.*[\\\/]/, ») : «/var/drop/foo/boo/moo.js».replace(/^.*[\\\/]/, ») возвращает moo.js

Читайте также:  Язык программирования java скрипт

@ZloySmiertniy Есть несколько хороших онлайн-объяснений регулярных выражений. rick.measham.id.au/paste/explain.pl?regex=%2F%5E . *% 5B% 5C% 5C% 5C% 2F% 5D% 2F и regexper.com/#%2F%5E . *% 5B % 5C% 5C% 5C% 2F% 5D% 2F должно помочь. (Ссылки здесь неработающие, но скопируйте и вставьте их во вкладку, и это сработает)

@nickf спасибо. Просто иногда выражение меняется в зависимости от языка. Regexper выглядит потрясающе! Рисование диаграммы выражения! : D

@ZloySmiertniy regex101.com также может быть полезен — вы можете указать, какой движок регулярных выражений вы используете.

Просто ради производительности я протестировал все ответы, приведенные здесь:

var substringTest = function (str) < return str.substring(str.lastIndexOf('/')+1); >var replaceTest = function (str) < return str.replace(/^.*(\\|\/|\:)/, ''); >var execTest = function (str) < return /([^\\]+)$/.exec(str)[1]; >var splitTest = function (str) < return str.split('\\').pop().split('/').pop(); >substringTest took 0.09508600000000023ms replaceTest took 0.049203000000000004ms execTest took 0.04859899999999939ms splitTest took 0.02505500000000005ms 

И победитель — это ответ стиля Split и Pop, благодаря bobince!

В мета-дискуссии, пожалуйста, добавьте соответствующую ссылку на другие ответы. Также было бы полезно лучше объяснить, как вы анализировали среду выполнения.

Не стесняйтесь тестировать и эту версию. Должен поддерживать пути к файлам Mac и Windows. path.split(/.*[\/|\\]/)[1];

Тест неверен. substringTest ищет только косую черту, execTest — только обратную косую черту, а два оставшихся обрабатывают обе косые черты. И реальные результаты не имеют значения (больше). Проверьте это: jsperf.com/name-from-path

На какой платформе появился путь? Пути Windows отличаются от путей POSIX, отличных от путей Mac OS 9, отличаются от путей RISC OS, разные.

Если это веб-приложение, где имя файла может поступать с разных платформ, нет ни одного решения. Однако разумный удар — использовать как «\» (Windows), так и «/» (Linux/Unix/Mac, а также альтернативу в Windows) в качестве разделителей путей. Здесь версия, отличная от RegExp, для дополнительного удовольствия:

var leafname= pathname.split('\\').pop().split('/').pop(); 

Возможно, вы захотите добавить, что классический MacOS (

Вы можете просто использовать pop () вместо reverse () [0]. Он также изменяет исходный массив, но в вашем случае это нормально.

Что-то вроде var path = ‘\\Dir2\\Sub1\\SubSub1’; //path = ‘/Dir2/Sub1/SubSub1’; path = path.split(‘\\’).length > 1 ? path.split(‘\\’).slice(0, -1).join(‘\\’) : path; path = path.split(‘/’).length > 1 ? path.split(‘/’).slice(0, -1).join(‘/’) : path; console.log(path);

Наименование «имя листа » происходит от имени структуры каталогов / файлов «Дерево», первым элементом дерева является root , последними являются листья => имя файла является последним в пути к дереву => leaf 🙂

В Node.js вы можете использовать модуль анализа пути.

var path = require('path'); var file = '/home/user/dir/file.txt'; var filename = path.parse(file).base; //=> 'file.txt' 

Ates, ваше решение не защищает от пустой строки в качестве входных данных. В этом случае он терпит неудачу с TypeError: /([^(\\|\/|\:)]+)$/.exec(fullPath) has no properties .

bobince, здесь версия nickf, которая обрабатывает разделители DOS, POSIX и HFS (и пустые строки):

Следующая строка кода JavaScript даст вам имя файла.

var z = location.pathname.substring(location.pathname.lastIndexOf('/')+1); alert(z); 

Не более кратким, чем nickf answer, но этот непосредственно «извлекает» ответ вместо замены нежелательных частей пустой строкой:

var filename = /([^\\]+)$/.exec(fullPath)[1]; 

Вопрос, задающий вопрос «получить имя файла без расширения», приведен здесь, но для этого нет решения. Вот решение, модифицированное из решения Bobbie.

var name_without_ext = (file_name.split('\\').pop().split('/').pop().split('.'))[0]; 
var lastPart = path.replace(/\\$/,'').split('\\').pop(); 

Он заменяет последний \ , поэтому он также работает с папками.

     

Маленькая функция для включения в ваш проект для определения имени файла по полному пути для Windows, а также по абсолютным путям GNU/Linux и UNIX.

/** * @param path Absolute path * @return File name * @todo argument type checking during runtime * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/lastIndexOf * @example basename('/home/johndoe/github/my-package/webpack.config.js') // "webpack.config.js" * @example basename('C:\\Users\\johndoe\\github\\my-package\\webpack.config.js') // "webpack.config.js" */ function basename(path) < let separator = '/' const windowsSeparator = '\\' if (path.includes(windowsSeparator)) < separator = windowsSeparator >return path.slice(path.lastIndexOf(separator) + 1) > 

Источник

File.name

Возвращает имя файла представленного объектом типа File . По соображениям безопасности не содержит пути к файлу.

Синтаксис

Значение

Строка, содержащая имя файла без пути, например, «My Resume.rtf».

Пример

input type="file" multiple onchange="processSelectedFiles(this)"> 
function processSelectedFiles(fileInput)  var files = fileInput.files; for (var i = 0; i  files.length; i++)  alert("Filename " + files[i].name); > > 

Проверьте результаты ниже:

Спецификация

Совместимость с браузерами

BCD tables only load in the browser

Смотрите также

Found a content problem with this page?

This page was last modified on 7 нояб. 2022 г. by MDN contributors.

Your blueprint for a better internet.

MDN

Support

Our communities

Developers

Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998– 2023 by individual mozilla.org contributors. Content available under a Creative Commons license.

Источник

Оцените статью