2010-01-14 102 views
5

我有一個非常簡單的文件上傳,允許用戶上傳PDF文件。在另一頁上,我通過錨標籤引用這些文件。但是,似乎當用戶上傳包含井號(#)的文件時,它會打破錨標記。它不會導致任何類型的Coldfusion錯誤,它只是無法找到該文件。如果我刪除#,它工作得很好。我相信還有一些其他人物會有這個相同的問題。英鎊符號(#)導致錯誤的文件名稱

我試過把URLEncodedFormat()放在錨點的文件名周圍,但是沒有幫助。我唯一能想到的其他事情是每次上傳時重命名該文件,並刪除「#」字符(以及其他任何「壞」字符)。

必須有一個更簡單的解決方案。有任何想法嗎?

+0

每次上傳文件時重命名該文件,並刪除「#」字符(以及任何其他「壞」字符)。對。 – Henry 2010-01-14 20:58:14

回答

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

是的,我們做了類似於後者的表達。但用「_」之類的東西替換已刪除的字符,使其明顯變爲文件名稱。儘管個人偏好:) – Leigh 2010-01-14 23:50:46

+0

這是一個不錯的方法。希望我能想到它。 – 2010-01-15 15:04:05

+0

這或多或少是我所做的。像Leigh一樣,我用'_'替換所有替代字符作爲警告給用戶。 – ale 2010-01-15 15:23:55

0

英鎊符號在網絡上的文件名中不合法。它們用於在頁面的錨目標:

<a name="target"> 

所以,如果你有文件#name.pdf,瀏覽器實際上是要找的文件「文件」和內部錨「name.pdf」。

是的,您必須在上傳時重命名文件。

+0

我知道我必須重新命名。我的問題是什麼是最簡單的解決方案來照顧#角色以及其他可能導致問題的角色。 – Jason 2010-01-14 21:13:05

+0

檢查出replace()或replaceList() – Henry 2010-01-14 21:29:24

+1

@Ben - 我可能是錯的,但我認爲你不必「重新命名。正確編碼#號應該工作(即文件%23.pdf)。但我同意重命名是更好的選擇(特別是考慮到CF對#的敏感度)。 – Leigh 2010-01-15 04:00:44

-1

可能你必須用#替換##以避免這種情況,我認爲這是由於#被認爲是Coldfusion關鍵字引起的。

+2

Coldfusion沒有問題。問題是它將其作爲頁面上的命名錨點讀取。 – Jason 2010-01-15 14:02:29

0

我還不能評論, 但Kevink的解決方案是好的,除非你需要維持你正在取代的東西。

我們遇到了一個需要重命名文件名的實例,但文件名需要稍微保留(用戶需求)。簡單地刪除特殊字符不是一個選項。因此我們不得不單獨處理每個替換,例如。

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