На всех моих серверах 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 (где карта сценариев .pl = c:\perl\bin\perl.exe "%s" %s).
Как я могу исправить эту установку Perl и заставить ее возвращать .\CGItemp1 по умолчанию?
Я даже скопировал всю папку Perl с одного из рабочих серверов на эту машину, но без радости.
Я проверил переменные среды «TMP» и «TEMP», а также $ENV{TMP} и $ENV{TEMP}, и они идентичны.
Из командной строки они указывают на каталог профиля пользователя, например:
C:\DOCUME~1\[USERNAME]\LOCALS~1\Temp
При запуске под IIS в качестве сценария CGI они оба указывают на:
c:\windows\temp
В ключе реестра HKEY_USERS/.DEFAULT/Environment на обоих серверах есть:
%USERPROFILE%\Local Settings\Temp
Реализация CGITempFile() ActiveState явно использует альтернативный механизм для определения того, как следует создавать временную папку.
Настоящая проблема связана с модулем CGI.pm и обращением с насадками. Всякий раз, когда файл загружается на сайт, CGI.pm необходимо временно сохранить его. Для этого в CGITempFile() вызывается CGI.pm для выделения временной папки. К сожалению, я не могу использовать File::Temp. Спасибо, в любом случае.
Это очень помогло. Раньше у меня было быстрое сканирование источника CGI.pm, но ваше предложение заставило меня вернуться и более внимательно изучить его, чтобы понять лежащий в основе алгоритм. У меня все заработало, но самое странное, что изначально на сервере не было папки c:\temp.
Чтобы получить временное исправление, я создал папку c:\temp и установил соответствующие разрешения для анонимной учетной записи пользователя веб-сайта. Но поскольку это общий ящик, я не мог оставить все так, даже если временные файлы удалялись. Короче говоря, я переименовал папку c:\temp во что-то другое, и волшебным образом возвращался правильный путь к папке .\. Я также заметил, что клиент включил на сайте расширения FrontPage, которые закрывают доступ на запись для анонимной учетной записи пользователя в папках веб-сайта, поэтому это разрешение потребовалось повторно применить. Я все еще не понимаю, почему в начале этой проблемы CGITempFile() возвращал c:\temp, хотя этой папки не существовало, и почему он снова начал работать волшебным образом.





Если вы запускаете этот сценарий от имени себя, проверьте переменную среды% TEMP%, чтобы узнать, не отличается ли она.
Если IIS выполняется, проверьте значения в реестре для TMP и TEMP в разделе HKEY_USERS / .DEFAULT / Среда
Имя временного каталога хранится в $CGITempFile::TMPDIRECTORY и инициализируется функцией find_tempdir в CGI.pm.
Алгоритм выбора временного каталога описан в документации CGI.pm (поиск -private_tempfiles).
IIUC, если на сервере существует папка C: \ Temp, CGI.pm будет использовать ее. Если ни один из каталогов, проверенных в find_tempdir, не существует, то текущий каталог "." используется.
Надеюсь, это поможет.
Не прямой ответ на ваш вопрос, но пробовали ли вы использовать File :: Temp?
Он специально разработан для работы с любой ОС.