如何将文件名中的阿拉伯数字转为英文数字?当前转换方案异常
解决文件名中东阿拉伯数字转西阿拉伯数字的问题
问题背景
需要将用户上传文件的文件名中的东阿拉伯数字(如٠、١、٢…٩)转换为西阿拉伯数字(0、1、2…9),避免下载时出现错误。但当前代码直接对文件对象执行替换操作,导致文件名被替换为临时文件名(如phpF77E.tmp),无法实现仅转换数字的需求。
错误原因
当前convert函数接收的是**Illuminate\Http\UploadedFile文件对象**,而非文件名字符串。直接对文件对象使用preg_replace会触发对象的字符串转换逻辑,返回临时文件名,而非对原始文件名进行修改。同时,preg_replace不适合用于普通字符串替换场景,应使用str_replace。
修正方案
1. 调整文件名处理逻辑
在storeCv函数中,先提取原始文件名,分离文件名和扩展名,仅对文件名部分执行数字转换,再重新组合为新文件名并设置到文件对象。
2. 修正转换函数
将preg_replace替换为str_replace,确保普通字符串替换的正确性。
修正后的代码
上传存储文件函数(storeCv)
public function storeCv(Request $request, $trainee_id) { $request->validate([ 'cv' => 'required_without:file', 'file' => 'required_without:cv', ]); $trainee = Trainee::findOrFail($trainee_id); $file = $request->file('cv') ?: $request->file('file'); // 提取原始文件名,分离文件名与扩展名 $originalName = $file->getClientOriginalName(); $fileName = pathinfo($originalName, PATHINFO_FILENAME); $extension = pathinfo($originalName, PATHINFO_EXTENSION); // 转换文件名中的东阿拉伯数字 $convertedFileName = $this->convert($fileName); $newFileName = $convertedFileName . '.' . $extension; // 设置转换后的文件名到文件对象 $file->setClientOriginalName($newFileName); $uploaded_file = $trainee->uploadToFolder($file, 'cv'); if ($trainee->cv_url) { $trainee->status = Trainee::STATUS_PENDING_APPROVAL; $trainee->save(); } return $uploaded_file; }
转换函数(convert)
public function convert($str) { $arabicEastern = ['٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩']; $arabicWestern = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']; return str_replace($arabicEastern, $arabicWestern, $str); }
关键说明
getClientOriginalName():获取用户上传的原始文件名,避免操作临时文件名pathinfo():安全分离文件名和扩展名,防止破坏文件格式setClientOriginalName():修改文件对象的原始文件名,确保后续存储时使用转换后的名称str_replace:适用于普通字符串替换场景,比preg_replace更高效且符合需求
内容的提问来源于stack exchange,提问作者Samar.H AlAli
相关产品推荐
相关产品推荐

