我有一个非常简单的文件上传,允许用户上传PDF文件。在另一页上,我然后通过锚标记引用这些文件。但是,当用户上传包含井号(#)的文件时,它似乎会破坏锚标记。它不会导致任何类型的Coldfusion错误,它只是找不到文件。如果我删除了#,它就可以了。我相信还有很多其他角色会遇到同样的问题。
我已经尝试将URLEncodedFormat()
放在锚点内的文件名周围,但这没有帮助。我能想到的唯一另一件事是每次上传时重命名文件并删除“#”字符(以及任何其他“坏”字符)。
必须有一个更简单的解决方案。有什么想法吗?
答案 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关键字。