Где CGI.pm обычно создает временные файлы? - PullRequest
2 голосов
/ 17 сентября 2008

На всех моих серверах 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 с одного из рабочих серверов на эту машину, но без радости.

@ Hometoast:

Я проверил переменные окружения '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() явно используется альтернативный механизм определения способа создания временной папки.

@ Ranguard:

Настоящая проблема связана с модулем CGI.pm и обработкой вложений. Всякий раз, когда файл загружается на сайт, CGI.pm необходимо хранить его где-то временно. Для этого CGITempFile() вызывается в CGI.pm для выделения временной папки. К сожалению, я не могу использовать File::Temp. В любом случае, спасибо.

@ Крис:

Это помогло куче. Раньше у меня было быстрое сканирование источника CGI.pm, но ваше предложение заставило меня вернуться и более внимательно изучить его, чтобы понять основной алгоритм. У меня все работает, но самое странное, что на сервере изначально не было папки c:\temp.

Чтобы получить временное исправление, я создал папку c:\temp и установил соответствующие разрешения для учетной записи анонимного пользователя на сайте. Но так как это общий ящик, я не мог оставить все как есть, даже если временные файлы были удалены. Короче говоря, я переименовал папку c:\temp во что-то другое, и волшебным образом был возвращен правильный путь к папке .\. Я также заметил, что заказчик включил расширения FrontPage на сайте, что исключает доступ на запись для учетной записи анонимного пользователя в папках сайта, поэтому это разрешение необходимо повторно применить. Я все еще не знаю, почему в начале этой проблемы CGITempFile() возвращал c:\temp, хотя эта папка не существовала, и почему она волшебным образом снова заработала.

Ответы [ 3 ]

8 голосов
/ 17 сентября 2008

Имя временного каталога хранится в $CGITempFile::TMPDIRECTORY и инициализируется в функции find_tempdir в CGI.pm. Алгоритм выбора временного каталога описан в документации CGI.pm (поиск по -private_tempfiles ). IIUC, если на сервере существует папка C: \ Temp, CGI.pm будет использовать ее. Если ни один из каталогов, отмеченных в find_tempdir, не существует, то текущий каталог "." используется.

Надеюсь, это поможет.

2 голосов
/ 17 сентября 2008

Не прямой ответ на ваш вопрос, но вы пытались использовать File :: Temp ?

Он специально разработан для работы на любой ОС.

1 голос
/ 17 сентября 2008

Если вы запускаете этот скрипт как вы, проверьте переменную среды% TEMP%, чтобы увидеть, если она отличается.

Если IIS выполняется, проверьте значения в реестре для TMP и TEMP в разделе HKEY_USERS / .DEFAULT / Окружающая среда

...