ASP文件对象问题

问题描述

我正在一个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()函数试图查找“图像”文件类型,所以没有文件计数,并且该函数返回找到的零个文件。在调试的同时,我发现oFileName.Type返回的值如下:

这是文件类型:JPG文件 这是文件类型:JPG文件 这是文件类型:文本文档 这是文件类型:数据库文件

文件夹中的文件是两个“ whatever.jpg”文件一个“ whatever.txt”文件一个“ thumbs.db”文件。因此,似乎操作系统(Windows Server 2019)可能已更改为不太通用,无法报告``图像''文件,并且现在正在报告``JPG文件''或``PNG文件''等。这当然会破坏此代码!大家是否对我可以如何修改代码以准确报告存在的图像文件有什么建议?

解决方法

在Windows 10上,Type.jpg文件的.png值分别为JPEG imagePNG image。您正在使用什么操作系统?

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

但是,如果您不想查看图像文件是否实际上是图像文件,则可以拆分文件扩展名,并使用Select Case对图像文件进行计数(如果操作系统仅返回{{1 }},而不再是XXX file值中的XXX image(或者,您可以拆分Type值,但您仍然需要检查有效的图像文件扩展名):

Type