A

ASP删除包含特殊字符文件造成的删除文件报错Server.MapPath() 错误 'ASP 0173 : 80004005'

HB 网络 2022-06-02

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。

改进:从上传模块处直接屏蔽上传文件名中的非法字符和包含逗号、空格等特殊字符。

PREV
wget -O /dev/null 释义
NEXT
使用growpart工具进行磁盘热扩容