IIS10.0+ASP站点后台删除文件时如果文件名有英文逗号报错Server.MapPath() 错误 'ASP 0173 : 80004005'
<%
....
.....
dim rs, pFilename, newsfile
set rs = ExecuteQuery("select pFilename from news where pID = " & ID)
if not rs.EOF then
pFilename = rs("pFilename")
if pFilename <> "" then
newsfile = "/upload/" & pFilename
call delfiles(newsfile)
end if
else
Alert("指定的新闻不存在!")
GoBack()
Response.End
end if
rs.close
set rs = nothing
sql = " delete from news where pID="&ID
ExecuteNonQuery(sql)
alert("删除成功!")
response.Write("<script language=javascript>self.location=document.referrer;</script>")'返回上页并刷新
Sub delfiles(struploadfiles)
If struploadfiles = "" Then Exit Sub
Dim fso, filePath
Set fso = CreateObject("Scripting.FileSystemObject")
filePath = Server.MapPath(struploadfiles)
If fso.FileExists(filePath) Then
On Error Resume Next
fso.DeleteFile(filePath)
If Err.Number <> 0 Then
Alert("删除附件时出错:" & Err.Description)
Err.Clear
End If
On Error GoTo 0
Else
Alert("附件文件不存在,无需删除。")
End If
Set fso = Nothing
end sub
....
.....
%>
解决方法:
手动拼接物理路径,而不是依赖 Server.MapPath。这样可以避免 Server.MapPath 对特殊字符的敏感性问题。
以下是修改后的代码:
<%
.....
.....
Sub delfiles(struploadfiles)
If struploadfiles = "" Then Exit Sub
Dim fso, filePath
Set fso = CreateObject("Scripting.FileSystemObject")
' 手动拼接物理路径,避免使用 Server.MapPath
filePath = Server.MapPath("/upload/") & "\" & Replace(struploadfiles, "/upload/", "")
If fso.FileExists(filePath) Then
On Error Resume Next
fso.DeleteFile(filePath)
If Err.Number <> 0 Then
Alert("删除附件时出错:" & Err.Description)
Err.Clear
End If
On Error GoTo 0
Else
Alert("附件文件不存在,无需删除。")
End If
Set fso = Nothing
end sub
....
.....
%>
修改说明:
手动拼接物理路径,使用 Server.MapPath("/upload/") 获取 /upload/ 目录的物理路径。
然后通过 Replace(struploadfiles, "/upload/", "") 去掉路径中的 /upload/ 部分,得到文件名。
最后将两者拼接成完整的物理路径。
避免直接使用 Server.MapPath 处理包含特殊字符的路径:
直接对包含特殊字符(如逗号)的路径使用 Server.MapPath 可能会导致错误。
通过手动拼接路径,可以绕过这个问题。
路径处理逻辑:
假设 struploadfiles 的格式是 /upload/filename.ext。
通过 Replace(struploadfiles, "/upload/", "") 去掉 /upload/,只保留文件名部分。
然后将文件名拼接到 /upload/ 目录的物理路径后,形成完整的文件路径。
示例:
假设
Server.MapPath("/upload/") 返回 C:\inetpub\wwwroot\upload\。
struploadfiles 的值为 /upload/test,file.txt。
经过处理后:
Replace(struploadfiles, "/upload/", "") 返回 test,file.txt。
最终 filePath 的值为 C:\inetpub\wwwroot\upload\test,file.txt。
改进:从上传模块处直接屏蔽上传文件名中的非法字符和包含逗号、空格等特殊字符。
