Проблема с файловым объектом ASP

#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) о том, почему поведение объекта файловой системы внезапно изменилось после стольких лет использования.