Js получить расширение файла

Обновлено: 07.07.2024

Im создает функцию загрузки файла в node.js с выражением 3.

Я хотел бы захватить расширение файла изображения. поэтому я могу переименовать файл, а затем добавить к нему расширение файла.

Как я могу получить расширение изображения в node.js?

Разве это не вопрос о MIME-типах, я хочу расширение файла @Jojje, так что решись. В заголовке и теле вашего вопроса запрашивается способ определения типа файла. Так в чем именно твоя проблема? Покажите нам некоторый код, скажите, что вы ожидаете от него, и что он делает вместо этого.

Я считаю, что вы можете сделать следующее, чтобы получить расширение имени файла.

Только будьте осторожны, он будет захватывать символы только после последней точки, поэтому имена файлов, такие как app.css.gz будут возвращать только .gz а не .css.gz , что может или не может быть тем, что вы хотите. @AamirAfridi Это возвращает ту же строку только без . , Обычно расширение является последним. И когда мы ожидаем более одного, например, tar.gz. лучше проверить, существует ли он в конце концов или нет. используя регулярное выражение, например. "tar.gz $" или созданием функции, которая делает это. как проверить это с конца и вернуться назад и посмотреть, полностью ли это соответствует. и у вас будет эта функция, которая проверяет расширение. ЗАЧЕМ? потому что насчет файлов, таких как jone.lastTest.654654556.tar.gz здесь ожидаемое расширение - tar.gz, но если вы примените любую функцию, которая дает форму 1-й точки, она не будет работать, как вы можете видеть @AllalMohamed Не совсем проблема в вашем случае. .tar.gz - это просто .tar через gzip. Вы можете выполнить gzip -d foo.tar.gz чтобы получить простой и простой foo.tar . Расширения имеют смысл - вам не нужно знать оба расширения одновременно. @Qix: для этого я только что привел пример. И да, ваша точка зрения имеет смысл и говорит сама за себя, так интересно, как кто-то не может заметить. Но представление о том, что мы делаем, - это не извлечение файлов, а их проверка. и убедившись, что мы принимаем только tar.gz, а не другой формат, то же самое можно применить и в другой ситуации, во многих случаях расширение может быть больше одного (например, .blade.php). Проверка на это более прямая, и мы всегда можем делать проверки уровень за уровнем. Без разницы. Спасибо за ваш комментарий, это очень полезно.

Я использую эту функцию для получения расширения файла, потому что я не нашел способ сделать это более простым способом (но я думаю, что есть):

для его использования требуется "путь".

другой метод, который не использует модуль пути:

Да, это работает. Просто подумал, что будет проще использовать узел. Вот что я сделал: var is = fs.createReadStream(req.files.upload.path), fileType = is.path.split(/[. ]+/).pop();

Если вы используете экспресс, добавьте следующую строку при настройке промежуточного программного обеспечения (bodyParser)

Это решение поддерживает querystrings!

Гораздо эффективнее использовать метод substring() вместо split() и pop()

Простое решение без необходимости требовать, которое решает проблему расширения множественного периода:

Или, если вам не нужна ведущая точка:

Убедитесь, что у файла есть расширение.

Я думаю, что отображение заголовка Content-Type в запросе также будет работать. Это будет работать даже в случаях, когда вы загружаете файл без расширения. (когда имя файла не имеет расширения в запросе)

Здесь заголовок Content-Type содержит тип mime данных. Сопоставление этого типа mime с расширением даст вам расширение файла:).

Restor BodyParser преобразует этот заголовок в свойство с именем type

Вы можете использовать этот заголовок и выполнять сопоставление расширения (подстрока и т.д.) вручную, но для этого также есть готовые библиотеки. Ниже двух были лучшие результаты, когда я просмотрел Google

Выше методы описаны ниже один за другим с соответствующим примером.

Полное имя файла сначала получается путем выбора файла ввода и получения его значения свойства. Это возвращает имя файла в виде строки.

С помощью метода split () мы разделим имя файла на 2 части. Первая часть будет именем файла, а вторая часть будет расширением файла.

Расширение может быть получено путем извлечения из массива последней строки методом pop (). Следовательно, это расширение файла выбранного файла.

Синтаксис:

Пример:

< title >How to get file extensions using JavaScript? </ title >

< body style = "text-align: center;" >

< h1 style = "color: green;" >GeeksforGeeks</ h1 >

< b >Here we will get "Extension" of selected file</ b >

< p >Select a file and click on the button

to check the file extension.</ p >

< input type = "file" id = "file1" />

< input type = "button" value = "Check Extension"

< p >The file extension is: < span class = "output" ></ span ></ p >

< script language = "javascript" >

Выход:


Начальный индекс задается с помощью метода lastIndexOf (). Это возвращает индекс в строке, где встречается строка, переданная последним. Последний индекс можно найти, передав точку (.) Этому методу. Индекс передается методу substring (), который возвращает строку от точки (.) До конца. Это расширение файла.

Синтаксис:

Пример:

< title >How to get file extensions using JavaScript? </ title >

< body style = "text-align: center;" >

< h1 style = "color: green;" >GeeksforGeeks</ h1 >

< b >Here we will get "Extension" of selected file</ b >

< p >Select a file and click on the button

to check the file extension.</ p >

< input type = "file" id = "file1" />

< input type = "button" value = "Check Extension"

< p >The file extension is: < span class = "output" ></ span ></ p >

< script language = "javascript" >

extension = fileName.substring(fileName.lastIndexOf('.') + 1);

Выход:


Регулярные выражения могут быть использованы для извлечения расширения файла из полного имени файла. Новый объект RegExp создается с регулярным выражением «[^.] + $». Символ каретки (^) отмечает начало строки. Точка (.) После каретки указывает, что строка выбрана после точки. Квантор плюс (+) выбирает одно или несколько слов. Доллар ($) используется для указания конца строки. Это выражение выбирает строку после точки.

Метод match () используется для возврата части строки, которая соответствует регулярному выражению, переданному ему в качестве параметра. Полное имя файла передается этому методу, а регулярное выражение возвращает только расширение файла.

Синтаксис:

Пример:

< title >How to get file extensions using JavaScript? </ title >

< body style = "text-align: center;" >

< h1 style = "color: green;" >GeeksforGeeks</ h1 >

< b >Here we will get "Extension" of selected file</ b >

< p >Select a file and click on the button

to check the file extension.</ p >

< input type = "file" id = "file1" />

< input type = "button" value = "Check Extension"

< p >The file extension is: < span class = "output" ></ span ></ p >

Новые Изменения: многое изменилось с тех пор, как этот вопрос был первоначально опубликован - есть много действительно хорошей информации в пересмотренный ответ wallacer а также отличное разрушение зрения

Edit: только потому, что это принятый ответ;wallacer это действительно намного лучше:

мой старый ответ:

должны сделать он.

Edit: в ответ на комментарий PhiLho, использовать что-то вроде:

сохранить его простым :)

Edit:

это еще одно решение без регулярных выражений, которое я считаю более эффективным:

есть некоторые случаи, которые лучше обрабатываются видение ниже, особенно файлы без расширений ( .htaccess и т. д.).

это очень эффективно, и обрабатывает угловые случаи, возможно, лучше, возвращая "" вместо полной строки, когда перед точкой нет ни точки, ни строки. Это очень хорошо продуманное решение, хотя и трудно читать. Вставьте его в своих помощниках lib и просто используйте его.

Старый Редактирование:

более безопасная реализация, если вы собираетесь запускать файлы без расширения или скрытые файлы без расширения (см. комментарий VisioN к ответу Тома выше), будет чем-то вроде этих строк

если a.length один, это видимый файл без расширения ie.

если a[0] === "" и a.length === 2 это скрытый файл без расширения ie. .реврайт

надеюсь, что это поможет прояснить проблемы с немного более сложными случаями. С точки зрения производительности, я считаю, что это решение немного медленнее, чем regex в большинстве браузеров. Тем не менее, для большинства распространенных целей этот код должен быть отлично использован.

следующее решение:быстро и short достаточно использовать в массовых операциях и сохранять дополнительные байты:

вот еще одно однострочное универсальное решение без регулярного выражения:

оба работают правильно с именами, не имеющими расширения (например,myfile) или начиная с . точка (например,.реврайт):

если вы заботитесь о скорости запуска benchmark и проверьте, что предоставленные решения являются самыми быстрыми, в то время как короткий чрезвычайно быстрый:

Speed comparison

как работает короткий:

  1. String.lastIndexOf метод возвращает последнюю позицию подстроки (т. е. "." ) в данной строке (т. е. fname ). Если подстрока не найдена, метод возвращает -1 .
  2. "неприемлемой" позицию точка в имени файла -1 и 0 , которые соответственно ссылаются на имена без расширения (например, "name" ) и к именам, которые начинаются с точки (например, ".htaccess" ).
  3. оператор сдвига вправо с нулевым заполнением ( >>> ) при использовании с нулем влияет на преобразование отрицательных чисел -1 to 4294967295 и -2 to 4294967294 , что полезно для сохранения имени файла без изменений в крайних случаях (своего рода трюк здесь).
  4. String.prototype.slice извлекает часть имени файла из позиции, которая была вычислена, как описано. Если номер позиции больше длины строки, метод возвращает "" .

если вы хотите более четкое решение, которое будет работать таким же образом (плюс с дополнительной поддержкой полного пути), проверьте следующую расширенную версию. Это решение будет медленнее чем предыдущие ОДН-вкладыши но гораздо легке для того чтобы понять.

все три варианты должны работать в любом веб-браузере на стороне клиента и могут использоваться в коде NodeJS на стороне сервера.

код

тест

обратите внимание, что при отсутствии запроса фрагмент все еще может присутствовать.

JSLint

быстрый и работает правильно с путями

в некоторых случаях

решения с использованием split медленны, а решения с lastIndexOf не обрабатывают крайние случаи.

Я просто хотел поделиться этой.

хотя это имеет падение, что файлы без расширения вернут последнюю строку. но если вы это сделаете, это исправит все:

edit: странно (или, может быть, это не так) во втором аргументе метода replace не работает. Извиняюсь.

Я только что понял, что недостаточно прокомментировать ответ p4bl0, хотя ответ Тома явно решает проблему:

для большинства приложений, простой скрипт, например

будет работать просто отлично (как предусмотрено Томом). Однако это не доказательство глупости. Он не работает, если указано следующее имя файла:

это может быть немного перебор, но я бы предложил использовать синтаксический анализатор url, такой как этот чтобы избежать сбоя из-за непредсказуемых имен файлов.

используя эту конкретную функцию, вы можете получить имя файла, например это:

это выведет " изображение.jpg " без url vars. Тогда вы можете захватить расширение файла.

всегда возвращает расширение lower cas, чтобы вы могли проверить его при изменении поля работает на:

.В формате JPEG (без расширения) . (noextension)

Если вы ищете конкретное расширение и знаете его длину, вы можете использовать substr:

Я много лун опоздал на вечеринку, но для простоты я использую что-то вроде этого

однострочное решение, которое также будет учитывать параметры запроса и любые символы в url.

ответ Wallacer хорош, но необходима еще одна проверка.

Если файл не имеет расширения, он будет использовать filename как расширение, которое не является хорошим.

Не забывайте, что некоторые файлы не имеют расширения, так:

не быть самоуверенным, или дуть в свою трубу, но я не видел любой блок кода для этой задачи (поиск 'правильный' расширение файла, среди батареи различных function входные аргументы), который работает так же, как и это.

  • строку: fileNameOrURL(само собой разумеется)

  • Boolean: showUnixDotFiles (показывать или нет файлы, начинающиеся с точки ".")

примечание (2): Если вам нравится мой код, обязательно добавьте его в свою библиотеку js и/или РЕПО, потому что я много работал над его совершенствованием, и было бы стыдно тратить впустую. Итак, без дальнейших церемоний, вот это:

Новое редактирование: Многие вещи изменились с тех пор, как этот вопрос был изначально опубликован - есть много действительно хорошей информации в пересмотренный ответ wallacer а также отличная разбивка VisioN

Изменить: Только потому, что это принятый ответ; ответ wallacer действительно намного лучше:

Мой старый ответ:

Должно это сделать.

Изменить: В ответ на комментарий PhiLho используйте что-то вроде:

Держите это просто:)

Edit:

Это другое нерепрессивное решение, которое, по моему мнению, более эффективно:

Есть некоторые угловые случаи, которые лучше обрабатываются ответом VisioN ниже, особенно файлы без расширения ( .htaccess и т.д.).

Он очень эффективен и обрабатывает угловые случаи, пожалуй, лучше, возвращая "" вместо полной строки, когда нет точки или нет строки перед точкой. Это очень хорошо разработанное решение, хотя и трудночитаемое. Вставьте его в свои помощники lib и просто используйте его.

Old Edit:

Более безопасная реализация, если вы собираетесь запускать файлы без расширения или скрытые файлы без расширения (см. комментарий VisioN для ответа Тома выше) будет что-то в этом направлении

Если a.length - один, это видимый файл без расширения, т.е. файл

Если a[0] === "" и a.length === 2 это скрытый файл без расширения, т.е..htaccess

Надеемся, что это поможет устранить проблемы со слегка более сложными делами. Что касается производительности, я считаю, что это решение немного медленнее, чем регулярное выражение в большинстве браузеров. Тем не менее, для большинства распространенных целей этот код должен быть полностью работоспособен.

Следующее решение быстро и короткое достаточно для использования в массовых операциях и сохранения дополнительных байтов:

Вот еще одно однострочное универсальное решение без регулярного выражения:

Оба работают правильно с именами, не имеющими расширения (например, myfile), или начиная с . dot (например .htaccess):

Если вам нужна скорость, вы можете запустить benchmark и убедиться, что предоставленные решения являются самыми быстрыми, а короткий - чрезвычайно быстро:

Speed comparison

Как работает короткий:

  • String.lastIndexOf метод возвращает последнюю позицию подстроки (т.е. "." ) в данной строке (т.е. fname ). Если метод substring не найден, возвращается -1 .
  • "Недопустимые" позиции точки в имени файла -1 и 0 , которые соответственно относятся к именам без расширения (например, "name" ) и именам, начинающимся с точки (например, ".htaccess" ).
  • Оператор сдвига нулевого заполнения ( >>> ), если используется с нулем, влияет на отрицательные числа, преобразуя -1 в 4294967295 и -2 до 4294967294 , что полезно для сохранения имени файла без изменений в случаях краев (вроде трюка здесь).
  • String.prototype.slice извлекает часть имени файла из позиции, которая была рассчитана, как описано. Если номер позиции больше, чем длина метода string возвращает "" .

Если вы хотите более четкое решение, которое будет работать одинаково (плюс с дополнительной поддержкой полного пути), проверьте следующую расширенную версию. Это решение будет медленнее, чем предыдущие однострочные, но гораздо легче понять.

Все три варианта должны работать в любом веб-браузере на стороне клиента и также могут использоваться в коде NodeJS на стороне сервера.

Протестировано с помощью

Быстро и правильно работает с путями

Некоторые краевые случаи

Решения, использующие split, медленны, а решения с lastIndexOf не обрабатывают случаи ребер.

код

Test

Обратите внимание, что в отсутствие запроса фрагмент все еще может присутствовать.

JSLint

Я просто хотел поделиться этим.

хотя это имеет падение, что файлы без расширения вернут последнюю строку. но если вы это сделаете, это зафиксирует все:

edit: Странно (или, может быть, нет) $1 во втором аргументе метода replace, похоже, не работает. Извините.

Я только понял, что этого недостаточно, чтобы пометить ответ p4bl0, хотя ответ Tom четко решает проблему:

всегда возвращает нижний предел расширения, чтобы вы могли проверить его при изменении поля работает для:

Для большинства приложений простой script, например

будет работать отлично (как сообщил Том). Однако это не является доказательством дурака. Он не работает, если предусмотрено следующее имя файла:

Это может быть немного избыточно, но я бы предложил использовать парсер url, например этот, чтобы избежать сбоя из-за непредсказуемых имен файлов.

Используя эту конкретную функцию, вы можете получить имя файла следующим образом:

Это будет выводить "image.jpg" без url-варов. Затем вы можете захватить расширение файла.

Если вы ищете конкретное расширение и знаете его длину, вы можете использовать substr:

У меня много спутников на вечеринке, но для простоты я использую что-то вроде этого

Однострочное решение, которое будет также учитывать параметры запроса и любые символы в URL.

Ответ Wallacer хорош, но нужна еще одна проверка.

Если файл не имеет расширения, он будет использовать имя файла как расширение, которое не является хорошим.

Не забывайте, что некоторые файлы не имеют расширения, поэтому:

Не быть слишком самоуверенным или дуть собственной трубой, но я не видел блок кода для этой задачи (нахождение "правильного" расширения файла среди батареи с различными входными аргументами function ), которая работает как хорошо, как это делает.

  • String: fileNameOrURL (самоочевидно)

  • Boolean: showUnixDotFiles (показывать или не показывать файлы, начинающиеся с точки "." )

Примечание (2): Если вам нравится мой код, обязательно добавьте его в библиотеку js и/или репо, потому что я много работал над его совершенствованием, и было бы позором идти впустую. Итак, без дальнейших церемоний, вот он:

Читайте также: