文件名中的井号(#)导致错误

时间:2010-01-14 20:50:28

标签: file-upload coldfusion anchor

我有一个非常简单的文件上传,允许用户上传PDF文件。在另一页上,我然后通过锚标记引用这些文件。但是,当用户上传包含井号(#)的文件时,它似乎会破坏锚标记。它不会导致任何类型的Coldfusion错误,它只是找不到文件。如果我删除了#,它就可以了。我相信还有很多其他角色会遇到同样的问题。

我已经尝试将URLEncodedFormat()放在锚点内的文件名周围,但这没有帮助。我能想到的唯一另一件事是每次上传时重命名文件并删除“#”字符(以及任何其他“坏”字符)。

必须有一个更简单的解决方案。有什么想法吗?

4 个答案:

答案 0 :(得分:5)

如果您控制文件上传代码,请尝试使用

验证字符串
 IsValid("url",usersFileName) or
 IsValid("regex",usersFileName,"[a-zA-Z0-9]")

否则,如果你对正则表达式感到满意,我会建议像之前的海报一样评论

  REReplace(usersfilename,"[^a-zA-Z0-9]","","ALL")

这些样本假设您将添加“.pdf”并且仅允许字母和数字。如果您需要下划线或期间它会是这样......

  REReplace(usersfilename,"[^a-zA-Z0-9\._]","","ALL")

我不是一个正则表达的大师,如果我有其中一个错误,我相信有几个会跳进去纠正我:)

答案 1 :(得分:0)

在网络上的文件名中,英镑符号不合法。它们用于页内锚定目标:

<a name="target">

因此,如果你有文件#name.pdf,浏览器实际上是在寻找文件“file”和内部锚“name.pdf”。

是的,您必须在上传时重命名文件。

答案 2 :(得分:0)

我还不能评论, 但除非你需要坚持你所取代的东西,否则Kevink的解决方案是好的。

我们遇到了一个需要重命名文件名的实例,但文件名需要稍微保留(用户要求)。简单地删除特殊字符不是一种选择。因此,我们必须单独处理每个替换,例如。

<cfset newName = replace(thisFile, "##", "(pound)", "All")>
<cfset newName = replace(newName , "&", "(amp)", "All")>
<cffile action="rename"source = "#ExpandPath("\uploads\#thisFolder#\#thisFile#")#" destination = "#newName#">

答案 3 :(得分:-1)

可能你必须用##替换#来避免这种情况,我认为这是因为#被认为是Coldfusion关键字。