JavaScript通过文件地址获取文件名称

news2025/3/13 21:25:26

在 JavaScript 中,可以通过文件链接地址提取文件名称。文件名称通常是链接中最后一个 / 之后的部分,可能还包含查询参数或哈希片段。以下是几种常见的提取文件名称的方法:


方法 1:使用 URL 对象和 pathname

URL 对象可以解析链接地址,并通过 pathname 获取路径部分,然后提取文件名。

代码示例:
function getFileNameFromUrl(url) {
  // 创建 URL 对象
  const urlObj = new URL(url);

  // 获取路径部分(例如:/path/to/file.pdf)
  const pathname = urlObj.pathname;

  // 提取文件名(最后一个 / 之后的部分)
  const fileName = pathname.substring(pathname.lastIndexOf('/') + 1);

  return fileName;
}

// 示例
const url = "https://example.com/path/to/file.pdf?query=123#section";
const fileName = getFileNameFromUrl(url);
console.log(fileName); // 输出:file.pdf

方法 2:使用 splitpop

通过 split 方法将链接地址按 / 分割成数组,然后使用 pop 获取最后一个部分。

代码示例:
function getFileNameFromUrl(url) {
  // 去掉查询参数和哈希片段
  const cleanUrl = url.split('?')[0].split('#')[0];

  // 按 / 分割路径,获取最后一个部分
  const fileName = cleanUrl.split('/').pop();

  return fileName;
}

// 示例
const url = "https://example.com/path/to/file.pdf?query=123#section";
const fileName = getFileNameFromUrl(url);
console.log(fileName); // 输出:file.pdf

方法 3:使用正则表达式

通过正则表达式匹配文件名部分。

代码示例:
function getFileNameFromUrl(url) {
  // 匹配最后一个 / 之后的部分(不包括查询参数和哈希片段)
  const regex = /\/([^\/?#]+)[^\/]*$/;
  const match = url.match(regex);

  // 如果匹配成功,返回文件名
  return match ? match[1] : null;
}

// 示例
const url = "https://example.com/path/to/file.pdf?query=123#section";
const fileName = getFileNameFromUrl(url);
console.log(fileName); // 输出:file.pdf

方法 4:处理带有查询参数或哈希片段的情况

如果文件名可能包含查询参数或哈希片段,可以通过以下方法提取纯净的文件名。

代码示例:
function getFileNameFromUrl(url) {
  // 创建 URL 对象
  const urlObj = new URL(url);

  // 获取路径部分
  const pathname = urlObj.pathname;

  // 提取文件名(最后一个 / 之后的部分)
  const fileNameWithParams = pathname.substring(pathname.lastIndexOf('/') + 1);

  // 去掉查询参数和哈希片段
  const fileName = fileNameWithParams.split('?')[0].split('#')[0];

  return fileName;
}

// 示例
const url = "https://example.com/path/to/file.pdf?query=123#section";
const fileName = getFileNameFromUrl(url);
console.log(fileName); // 输出:file.pdf

方法 5:处理没有文件名的链接

如果链接地址没有文件名(例如以 / 结尾),可以返回一个默认值或空字符串。

代码示例:
function getFileNameFromUrl(url) {
  const urlObj = new URL(url);
  const pathname = urlObj.pathname;

  // 如果路径以 / 结尾,返回空字符串或默认值
  if (pathname.endsWith('/')) {
    return ''; // 或者 return 'index.html';
  }

  // 提取文件名
  const fileName = pathname.substring(pathname.lastIndexOf('/') + 1);
  return fileName;
}

// 示例
const url1 = "https://example.com/path/to/file.pdf";
const url2 = "https://example.com/path/to/";

console.log(getFileNameFromUrl(url1)); // 输出:file.pdf
console.log(getFileNameFromUrl(url2)); // 输出:'' 或 'index.html'

总结

提取文件名称的常用方法包括:

  1. 使用 URL 对象和 pathname:推荐使用,兼容性好。
  2. 使用 splitpop:简单直接,适合大多数场景。
  3. 使用正则表达式:灵活,适合复杂场景。
  4. 处理查询参数和哈希片段:确保提取的文件名是纯净的。

根据你的需求选择合适的方法即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2314497.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL 优化方案

一、MySQL 查询过程 MySQL 查询过程是指从客户端发送 SQL 语句到 MySQL 服务器,再到服务器返回结果集的整个过程。这个过程涉及多个组件的协作,包括连接管理、查询解析、优化、执行和结果返回等。 1.1 查询过程的关键组件 连接管理器:管理…

智能对话小程序功能优化day1-登录鉴权

目录 1.数据库表构建。 2.完善登录相关的实例对象。 3.登录相关功能实现。 4.小程序效果。 最近尝试下trae加入claude3.7后的读图生成代码功能,可以看到简单的页面一次性生成确实准确率高了不少,想起来之前笔记中开发的智能问答小程序功能还是有些简…

MinIO的预签名直传机制

我们传统使用MinIo做OSS对象存储的应用方式往往都是在后端配置与MinIO的连接和文件上传下载的相关接口,然后我们在前端调用这些接口完成文件的上传下载机制,但是,当并发量过大,频繁访问会对后端的并发往往会对服务器造成极大的压力…

Qt开源控件库(qt-material-widgets)的编译及使用

项目简介 qt-material-widgets是一个基于 Qt 小部件的 Material Design 规范实现。 项目地址 项目地址:qt-material-widgets 本地构建环境 Win11 家庭中文版 VS2019 Qt5.15.2 (MSVC2019) 本地构建流程 克隆后的目录结构如图: 直接使用Qt Crea…

用python批量生成文件夹

问题描述 当批量生成文件夹时,手动右键创建文件夹是一个繁琐的过程,尤其是文件夹的命名过程。假设从3月10日到3月19日,每天要为某个日常工作创建一个名为2025031x的文件夹,手动创建文件夹并命名费时费力。 百度给出了以下四种方法…

【MySQL】基本操作 —— DDL

目录 DDLDDL 常用操作对数据库的常用操作查看所有数据库创建数据库切换、显示当前数据库删除数据库修改数据库编码 对表的常用操作创建表数据类型数值类型日期和时间类型字符串类型 查看当前数据库所有表查看指定表的创建语句查看指定表结构删除表 对表结构的常用操作给表添加字…

游戏引擎学习第152天

仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾昨天的内容 这个节目展示了我们如何从零开始制作一款完整的游戏。我们不使用任何游戏引擎或库,而是从头开始创建一款游戏,整个开发过程都会呈现给大家。你将能够看到每一行代码的编写,了解…

考研数学非数竞赛复习之Stolz定理求解数列极限

在非数类大学生数学竞赛中,Stolz定理作为一种强大的工具,经常被用来解决和式数列极限的问题,也被誉为离散版的’洛必达’方法,它提供了一种简洁而有效的方法,使得原本复杂繁琐的极限计算过程变得直观明了。本文&#x…

故障诊断——neo4j入门

文章目录 neo4jQuickStartDemo neo4j QuickStart 详情可见博客:https://www.cnblogs.com/nhdlb/p/18703804,使用docker拉取最近的一个版本进行创建 docker run -it -d -p 7474:7474 -p 7687:7687 \ -v /disk5/neo4j_docker/data:/data \ -v /disk5/ne…

【JavaWeb】快速入门——HTMLCSS

文章目录 一、 HTML简介1、HTML概念2、HTML文件结构3、可视化网页结构 二、 HTML标签语法1、标题标签2、段落标签3、超链接4、换行5、无序列表6、路径7、图片8、块1 盒子模型2 布局标签 三、 使用HTML表格展示数据1、定义表格2、合并单元格横向合并纵向合并 四、 使用HTML表单收…

若依框架-给sys_user表添加新字段并获取当前登录用户的该字段值

目录 添加字段 修改SysUser类 修改SysUserMapper.xml 修改user.js 前端获取字段值 添加字段 若依框架的sys_user表是没有age字段的,但由于业务需求,我需要新添加一个age字段: 修改SysUser类 添加age字段后,要在SysUser类 …

前端监测窗口尺寸和元素尺寸变化的方法

前端监测窗口尺寸变化和元素尺寸变化的方法 window.resize 简介 window.resize事件是浏览器提供的一种事件,用于监听窗口大小的改变。这意味着当用户调整浏览器窗口大小时,相关的JavaScript代码将被触发执行。这为开发者提供了一种机制,可…

ubuntu 部署deepseek

更新 apt update 升级 apt upgrade 格式化硬盘 mkfs.ext4 /dev/sdb 安装nginx 查看端口 一、安装Ollama Ollama是一个开源的大型语言模型(LLM)推理服务器,为用户提供了灵活、安全和高性能的语言模型推理解决方案。 ollama/docs/linux.m…

MySQL库和表的操作详解:从创建库到表的管理全面指南

目录 一、MySQL库的操作详解 〇、登录MySQL 一、数据库的创建与字符集设置 1. 创建数据库的语法 2. 创建数据库示例 查看创建出来的文件: bash下查看MySQL创建的文件 二、字符集与校验规则 1. 查看系统默认设置 2. 查看支持的字符集与校验规则 3. 校验规则对查询的影响…

PyTorch 系列教程:使用CNN实现图像分类

图像分类是计算机视觉领域的一项基本任务,也是深度学习技术的一个常见应用。近年来,卷积神经网络(cnn)和PyTorch库的结合由于其易用性和鲁棒性已经成为执行图像分类的流行选择。 理解卷积神经网络(cnn) 卷…

Java 大视界 -- Java 大数据中的数据可视化大屏设计与开发实战(127)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…

「Unity3D」UGUI将元素固定在,距离屏幕边缘的某个比例,以及保持元素自身比例

在不同分辨率的屏幕下,UI元素按照自身像素大小,会发生位置与比例的变化,本文仅利用锚点(Anchors)使用,来实现UI元素,固定在某个比例距离的屏幕边缘。 首先,将元素的锚点设置为中心&…

Deep research深度研究:ChatGPT/ Gemini/ Perplexity/ Grok哪家最强?(实测对比分析)

目前推出深度研究和深度检索的AI大模型有四家: OpenAI和Gemini 的deep research,以及Perplexity 和Grok的deep search,都能生成带参考文献引用的主题报告。 致力于“几分钟之内生成一份完整的主题调研报告,解决人力几小时甚至几天…

关于sqlalchemy的ORM的使用

关于sqlalchemy的ORM的使用 二、创建表三、使用数据表、查询记录三、批量插入数据四、关于with...as...:的使用 二、创建表 使用Mapped来映射字段 from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker,Mapped,mapped_columnBa…

【leetcode hot 100 148】排序序列

解法一:(双重循环)第一个循环head,逐步将head的node加入有序列表;第二个循环在有序列表中找到合适的位置,插入node。 /*** Definition for singly-linked list.* public class ListNode {* int val;* …