#asp-classic #filesystemobject
#asp-classic #filesystemobject
Вопрос:
Я работаю над веб-сайтом ASP classic, на котором, как сообщил клиент, внезапно обнаружилась проблема с ранее работающей функцией, в которой перечислены только типы файлов «изображения». Прочитав код, я обнаружил, что цикл, в котором перечислены файлы в папке, использует функцию InStr() для идентификации файлов по их типу, который должен быть «image». Однако я обнаружил, что что-то, должно быть, изменилось в ОС, поскольку тип больше не «изображение», а «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 .Тип, был следующим:
Это тип файла: файл JPG Это тип файла: файл JPG Это тип файла: Текстовый документ Это тип файла: файл базы данных
Файлов в папке было два «whatever.jpg «файлы, а»whatever.txt » файл» и файл «thumbs.db». Итак, похоже, что ОС (Windows Server 2019), возможно, изменилась, чтобы быть менее универсальной, сообщая о файле «изображения», и теперь сообщает о «файле JPG» или «файле PNG» и т. Д. Это, конечно, нарушает этот код! Есть ли у вас какие-либо предложения о том, как я мог бы изменить этот код, чтобы точно сообщать, сколько файлов изображений присутствует?
Ответ №1:
В Windows 10 Type
значения для .jpg
.png
файлов и JPEG image
равны и PNG image
соответственно. Какую ОС вы используете?
Кроме того, Type
на самом деле файл не анализируется, у вас может быть virus.exe
файл в папке, в которую он был переименован virus.jpg
, и Type
значение по-прежнему будет отображаться как JPEG
. Поэтому, если функция имеет отступ для проверки загруженного пользователем содержимого, чтобы убедиться, что изображения на самом деле являются изображениями, Type
значение будет бесполезным. Если у вас есть root-доступ, вы можете установить COM DLL, которая использует такую программу, как ExifTool, для правильного анализа файлов (https://github.com/as08/ClassicASP.ExifTool ), однако это было бы полным переписыванием.
Но предполагая, что вы не хотите проверять, является ли файл изображения на самом деле файлом изображения, вы можете просто разделить расширения имени файла и использовать Select Case
для подсчета файлов изображений, если ваша ОС возвращает только XXX file
значение, а не XXX image
Type
значение (в качестве альтернативы вы можете разделить 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)
Комментарии:
1. Привет, Адам. Спасибо за ваш ответ! Я должен был упомянуть ОС и отредактировать вопрос, указав, что это Windows Server 2019, который функционально такой же, как Windows 10. Я считаю, что ваше решение будет работать, если клиент знает и ограничен использованием наиболее популярных форматов изображений / типов файлов. Я полагаю, что есть также способ использовать компонент, подобный тому, который предлагает Chilkat, для проверки первых 2 байтов файла, чтобы определить его тип, но да, это будет полная переписка, я изучу это и проконсультируюсь с клиентом, чтобы найти, в какую сторону идти.
2. Я, наконец, приступил к реализации этого, и, похоже, пока работает, но по-прежнему интересно, что это внезапно перестало работать так, как было. Это код, написанный более 10 лет назад, который работал, пока какое-то обновление Microsoft не заставило объект файловой системы работать по-другому. Я попытаюсь обсудить это с Microsoft next, а затем прокомментирую подробнее, когда у меня будет больше информации.
3. Когда я проголосовал за это, я подумал, что это его принятие. Есть ли что-то еще, что мне нужно сделать? Пожалуйста, дайте мне знать. Спасибо! Неважно, разобрался. Спасибо за вашу помощь! Я полагаю, что это был бы другой вопрос (возможно, для Microsoft) о том, почему поведение объекта файловой системы внезапно изменилось после стольких лет использования.