You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将文件名中的阿拉伯数字转为英文数字?当前转换方案异常

解决文件名中东阿拉伯数字转西阿拉伯数字的问题

问题背景

需要将用户上传文件的文件名中的东阿拉伯数字(如٠、١、٢…٩)转换为西阿拉伯数字(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 17:18:20