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 image
和 PNG 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)
我正在开发一个 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 image
和 PNG 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)