文件名含多空格上传后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
相关产品推荐
相关产品推荐

