
本文介绍一种安全、可靠的方法:将文件名与扩展名分离处理,在总长度超限时仅截断主文件名部分,确保扩展名始终完整显示在末尾。
本文介绍一种安全、可靠的方法:将文件名与扩展名分离处理,在总长度超限时仅截断主文件名部分,确保扩展名始终完整显示在末尾。
在实际 Web 开发中,常需对过长的文件名进行前端友好型截断(如显示在表格或卡片中),但直接使用 mb_strimwidth() 截断整个字符串会破坏文件扩展名(如 .pdf、.xlsx),影响用户识别文件类型。正确做法是先提取扩展名,再对主体部分做智能截断,最后拼接扩展名。
以下是推荐的 PHP 实现方案:
<?php
function formatNameFile($nama) {
// 安全提取扩展名(兼容多点文件名,如 archive.tar.gz)
$pathInfo = pathinfo($nama);
$extension = $pathInfo['extension'] ?? '';
// 若无扩展名,直接返回原字符串(避免追加空字符串)
if (empty($extension)) {
return strlen($nama) > 23 ? mb_strimwidth($nama, 0, 23, '...') : $nama;
}
// 获取不带扩展名的主体部分
$nameWithoutExt = $pathInfo['filename'];
// 计算可用长度:总限制 23 字符 - 扩展名长度(含点号)
$maxNameLength = 23 - (strlen($extension) + 1); // +1 是为保留 '.' 分隔符
// 确保至少保留部分文件名(避免出现 "...pdf" 这类无效结果)
if ($maxNameLength < 4) {
$maxNameLength = 4;
}
// 截断主体,并拼接扩展名
$truncatedName = strlen($nameWithoutExt) > $maxNameLength
? mb_strimwidth($nameWithoutExt, 0, $maxNameLength, '...')
: $nameWithoutExt;
return $truncatedName . '.' . $extension;
}
// 测试用例
echo formatNameFile('resume_t8ffvwnjxibqwhu5l0mk1jwu9mmb4b_3.pdf'); // 输出:resume_t8ffvwnjxibqw...pdf
echo "\n";
echo formatNameFile('very_long_filename_without_extension'); // 输出:very_long_filename_wi...
echo "\n";
echo formatNameFile('data.tar.gz'); // 输出:data...tar.gz(正确支持多级扩展名)
?>✅ 关键优化说明:
- 使用
pathinfo()替代explode('.', $nama),可准确处理含多个点的合法文件名(如archive.tar.gz),避免错误截取扩展名; - 动态计算主体截断长度(
23 - strlen($extension) - 1),确保...+.+ext整体不超过 23 字符限制; - 增加最小长度保护(
$maxNameLength 时设为 4),防止极端情况下扩展名“吞掉”全部有效文件名; - 兼容无扩展名场景,避免拼接冗余
.。
⚠️ 注意事项:
立即学习“PHP免费学习笔记(深入)”;
-
mb_strimwidth()依赖mbstring扩展,请确保 PHP 环境已启用; - 如需严格保持「前缀 + ... + 扩展名」总长 ≤ 23,建议统一使用
mb_strlen()替代strlen()处理多字节字符(如中文文件名); - 若需前端同步展示逻辑,建议将该函数封装为公共工具,并在 JS 中实现对应逻辑以保证一致性。
此方案兼顾健壮性、可读性与实用性,适用于各类文件管理界面的名称渲染场景。



















