ASP 文件对象问题

ASP File Object Issue

我正在开发一个 ASP 经典网站,客户报告该网站突然出现了一个问题,之前的功能只列出了“图像”文件类型。阅读代码后,我发现列出文件夹中文件的循环使用 InStr() 函数按文件类型(应为“图像”)识别文件。但是,我发现 OS 中肯定发生了一些变化,因为类型不再是“图像”,而是“JPG”或“PNG”等。这极大地改变了代码的工作方式。以下是代码片段:


Set oFSO = Server.CreateObject("Scripting.FileSystemObject")
Set oFolder = oFSO.GetFolder(Server.MapPath(sCurrentDirectoryPath))
Set oSubFolder = oFolder.Files
                            
    iFileCount = 0
                            
    For Each oFileName in oSubFolder
                
        If InStr(1, LCase(oFileName.Type),"image") > 0 Then
            iFileCount = iFileCount + 1
        End If
    Next

因为 InStr() 函数正在尝试查找“图像”文件类型,所以没有文件被计算在内,函数 returns 找到了零个文件。在调试时,我发现 oFileName.Type 返回的值如下:

这是文件type:JPG文件 这是文件 type:JPG 文件 这是文件 type:Text 文件 这是文件 type:Data 基本文件

文件夹中的文件是两个“whatever.jpg”文件、一个“whatever.txt”文件和一个“thumbs.db”文件。因此,似乎 OS (Windows Server 2019) 可能已更改为报告“图像”文件时不太通用,现在报告“JPG 文件”或“PNG 文件”等. 这当然打破了这个密码!你们有什么关于我如何修改这段代码以准确报告存在多少图像文件的建议吗?

在 Windows 10 上,.jpg.png 文件的 Type 值分别为 JPEG imagePNG image。 OS 你在用什么?

此外,Type 并没有实际分析文件,您可能在文件夹中有一个 virus.exe 文件已重命名为 virus.jpg,而 Type 值仍将显示为 JPEG。因此,如果缩进函数以检查用户上传的内容以确保图像确实是图像,则 Type 值将没有用。如果您有 root 访问权限,您可以安装一个 COM DLL,它使用 ExifTool 等程序来正确分析文件 (https://github.com/as08/ClassicASP.ExifTool),但是这将是一个完整的重写。

但是假设您不想检查图像文件是否真的是图像文件,如果您的 OS仅返回 XXX file 而不再返回 Type 值中的 XXX image (或者您可以拆分 Type 值,但您仍然需要检查有效的图像文件扩展名):

Dim oFSO, oFolder, oSubFolder, oFileName, iFileCount, oFileNameSplit

Set oFSO = Server.CreateObject("Scripting.FileSystemObject")
Set oFolder = oFSO.GetFolder(Server.MapPath(sCurrentDirectoryPath))
Set oSubFolder = oFolder.Files
                        
    iFileCount = 0
                        
    For Each oFileName In oSubFolder
    
        oFileNameSplit = Split(oFileName.Name,".")
        
        If uBound(oFileNameSplit) > 0 Then
        
            Select Case Trim(lCase(oFileNameSplit(uBound(oFileNameSplit))))
            
                Case "jpg", "jpeg", "png", "gif" ' Maybe add some more extensions...
                
                iFileCount = iFileCount + 1
                
            End Select
        
        End If
    
    Next

Set oFSO = Nothing
Set oFolder = Nothing
Set oSubFolder = Nothing

Response.Write(iFileCount)