Где CGI.pm обычно создаются временные файлы?
-
01-07-2019 - |
Вопрос
На всех моих серверах Windows, за исключением одной машины, когда я выполняю следующий код для выделения папки временных файлов:
use CGI;
my $tmpfile = new CGITempFile(1);
print "tmpfile='", $tmpfile->as_string(), "'\n";
Переменная $tmpfile
присваивается значение '.\CGItemp1'
и это то, чего я хочу.Но на одном из моих серверов он неправильно установлен на C:\temp\CGItemp1
.
Все серверы работают под управлением Windows 2003 Standard Edition, IIS6 и ActivePerl 5.8.8.822 (обновление до более поздней версии Perl невозможно).Результат всегда один и тот же при запуске скрипта из командной строки или в IIS в виде CGI-скрипта (где scriptmap .pl
= c:\perl\bin\perl.exe "%s" %s
).
Как я могу исправить эту установку Perl и заставить ее вернуться '.\CGItemp1
- по умолчанию?
Я даже скопировал всю папку Perl с одного из рабочих серверов на этот компьютер, но без особой радости.
Я проверил 'TMP
" и "TEMP
' переменные среды , а также $ENV{TMP}
и $ENV{TEMP}
и они идентичны.
Из командной строки они указывают на каталог профиля пользователя, например:
C:\DOCUME~1\[USERNAME]\LOCALS~1\Temp\1
При запуске в IIS в виде CGI-скрипта они оба указывают на:
c:\windows\temp
В разделе реестра HKEY_USERS/.DEFAULT/Environment
, оба сервера имеют:
%USERPROFILE%\Local Settings\Temp
Реализация ActiveState в CGITempFile()
явно использует альтернативный механизм для определения того, как он должен генерировать временную папку.
Настоящая проблема заключается в CGI.pm
обработка модулей и навесного оборудования.Всякий раз, когда файл загружается на сайт CGI.pm
нужно хранить его где-нибудь временно.Чтобы сделать это CGITempFile()
вызывается внутри CGI.pm
чтобы выделить временную папку.Так что, к сожалению, я не могу использовать File::Temp
.В любом случае, спасибо.
Это очень помогло.Я действительно быстро просмотрел CGI.pm
исходный код приведен ранее, но ваше предложение заставило меня вернуться назад и присмотреться к нему более внимательно, чтобы понять лежащий в основе алгоритм.У меня все заработало, но самое странное, что изначально не было никакого c:\temp
папка на сервере.
Чтобы получить временное исправление, я создал c:\temp
папку и установите соответствующие разрешения для учетной записи анонимного пользователя веб-сайта.Но поскольку это общий ящик, я не мог оставить все как есть, даже несмотря на то, что временные файлы были удалены.Короче говоря, я переименовал c:\temp
папку к чему-то другому и волшебным образом правильному '.\
'возвращался путь к папке.Я также заметил, что клиент включил расширения FrontPage на сайте, которые удаляют доступ на запись для учетной записи анонимного пользователя в папках веб-сайта, поэтому это разрешение требовало повторного применения.Я все еще в недоумении относительно того, почему в начале этого выпуска CGITempFile()
возвращался c:\temp
, даже несмотря на то, что эта папка не существовала, и почему она волшебным образом снова начала работать.
Решение
Имя временного каталога хранится в $CGITempFile::TMPDIRECTORY
и инициализирован в find_tempdir
функция в CGI.pm.Алгоритм выбора временного каталога описан в CGI.pm документации (поиск по -private_tempfiles -личные файлы).IIUC, если на сервере существует C: emp папка, CGI.pm будет использовать ее.Если ни один из каталогов не зарегистрирован find_tempdir
существует, тогда используется текущий каталог ".".
Я надеюсь, что это поможет.
Другие советы
Это не прямой ответ на ваш вопрос, но пробовали ли вы использовать Файл::Temp?
Он специально разработан для работы на любой операционной системе.
Если вы запускаете этот скрипт от своего имени, проверьте переменную окружения %TEMP%, чтобы увидеть, отличается ли она.
Если выполняется IIS, проверьте значения TMP и TEMP в реестре в разделе HKEY_LOCALUSERS/.DEFAULT/Environment