【问题标题】:ASP File Object IssueASP 文件对象问题
【发布时间】:2020-09-26 03:43:20
【问题描述】:

我正在开发一个 ASP 经典网站,客户报告该网站突然出现一个问题,该问题与之前仅列出“图像”文件类型的工作功能有关。阅读代码后,我发现列出文件夹中文件的循环使用 InStr() 函数按类型识别文件,应该是“图像”。但是,我发现操作系统中一定发生了一些变化,因为类型不再是“图像”,而是“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文件”等。这当然会破坏此代码!大家对我如何修改此代码以准确报告存在多少图像文件有什么建议吗?

【问题讨论】:

    标签: asp-classic filesystemobject


    【解决方案1】:

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

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

    但假设您不想检查图像文件是否实际上是图像文件,您可以拆分文件扩展名并使用 Select Case 来计算图像文件,如果您的操作系统仅返回 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)
    

    【讨论】:

    • 你好亚当。谢谢您的回答!我应该提到操作系统,并编辑了问题以包括它是 Windows Server 2019,它在功能上与 Windows 10 相同。我相信你的解决方案会起作用,只要客户端知道并限制使用最流行的图像格式/文件类型。我相信还有一种方法可以使用 Chilkat 提供的组件来检查文件的前 2 个字节以确定它的类型,但是是的,这将是一个完整的重写我会研究这个并咨询与客户一起寻找前进的方向。
    • 我终于开始实施它,到目前为止它似乎正在工作,但它突然停止按原来的方式工作仍然令人感兴趣。这是 10 多年前编写的代码,它一直在工作,直到某种 Microsoft 更新导致文件系统对象以不同的方式工作。接下来我将尝试与 Microsoft 讨论这个问题,然后在我有更多信息时发表更多评论。
    • @PaulScott 例如,您似乎可以接受这个答案?
    • 当我投票赞成时,我认为这是接受它。还有什么我需要做的吗?请告诉我。谢谢!没关系,想通了。感谢您的帮助!我想,为什么 FileSystem 对象的行为在使用这么多年后突然发生了变化,这将是一个不同的问题(也许对微软来说)。
    猜你喜欢
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 2010-10-28
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多