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

文件名含多空格上传后SERVERFILE单空格问题及解决诉求

问题描述

上传原文件名为「Front page.jpg」(Front与page之间有两个空格)的文件后,提交表单时cffile.SERVERFILE返回的文件名变为「Front page.jpg」(仅单个空格),但文件实际仍以双空格的原文件名存储在服务器目录中。需要将含多空格的真实文件名传递至其他页面用于文件存在性检查,当前因返回值的空格被合并导致检测失败。

约束条件:

  • 使用<pre>标签可正常显示带多空格的文件名;
  • 不得通过重命名文件(如下划线替换空格)规避问题;
  • 必须保留原文件名的多空格格式传递至其他页面。

原始示例代码:

if( cgi.REQUEST_METHOD == "post" ) {
       tempDir = expandPath( "./temp" ) & "/";
       if( !directoryExists( tempDir ) ) directoryCreate( tempDir );

        
        fileData = fileUpload( tempDir, "fileField", "*", "makeunique" );
        writeoutput( "使用Pre标签显示: <pre>#fileData.serverFile#</pre>" );
        writeoutput( "不使用Pre标签显示: #fileData.serverFile#" );

        writeDump( fileData );
    }
解决方法

方法1:从服务器目录匹配真实文件名

上传后的文件已保存在指定目录,可通过文件大小、修改时间筛选出真实文件名(避免同名文件干扰):

if( cgi.REQUEST_METHOD == "post" ) {
    tempDir = expandPath( "./temp" ) & "/";
    if( !directoryExists( tempDir ) ) directoryCreate( tempDir );

    fileData = fileUpload( tempDir, "fileField", "*", "makeunique" );
    
    // 获取目录内文件的详细信息(名称、大小、修改时间)
    uploadedFiles = directoryList(tempDir, false, "name,size,lastmodified");
    realFileName = "";
    
    // 匹配刚上传的文件(10秒内修改+大小一致)
    for(file in uploadedFiles) {
        if(file.size == fileData.fileSize && dateDiff("s", file.lastmodified, now()) < 10) {
            realFileName = file.name;
            break;
        }
    }

    writeoutput( "真实文件名(带多空格): <pre>#realFileName#</pre>" );
    // 将真实文件名存入session或表单隐藏域,传递至其他页面
    session.realFileName = realFileName;
}

方法2:利用规范路径获取真实文件名

通过getCanonicalPath解析文件路径,自动还原系统中存储的真实文件名:

if( cgi.REQUEST_METHOD == "post" ) {
    tempDir = expandPath( "./temp" ) & "/";
    if( !directoryExists( tempDir ) ) directoryCreate( tempDir );

    fileData = fileUpload( tempDir, "fileField", "*", "makeunique" );
    
    // 构造临时文件路径(用处理后的serverFile)
    filePath = tempDir & fileData.serverFile;
    // 获取系统识别的规范路径,包含真实文件名
    canonicalPath = getCanonicalPath(filePath);
    // 从路径中提取文件名
    realFileName = listLast(canonicalPath, "/\");

    writeoutput( "真实文件名(带多空格): <pre>#realFileName#</pre>" );
    // 传递真实文件名至其他页面
}

方法3:关闭文件名空格归一化配置

部分ColdFusion版本支持通过配置关闭文件名的空格合并,在Application.cfc中添加以下设置:

component {
    this.settings = {
        "coldfusion.server.fileupload.normalizefilename": false
    };
}

设置后,fileData.serverFile将直接返回原始的多空格文件名,无需额外处理。

方法说明
  • 方法1:通用所有ColdFusion版本,无需修改配置,适合无权限调整应用设置的场景;
  • 方法2:依赖getCanonicalPath函数(CF10及以上版本支持),逻辑更简洁;
  • 方法3:一劳永逸,适合有权限修改应用配置的场景。

内容的提问来源于stack exchange,提问作者Kannan.P

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 06:53:13