perl
  • cgi
  • activestate
  • 2008-09-17 3 views 2 likes 
    2

    На всех моих серверов Windows, за исключением одной машины, когда я выполнить следующий код, чтобы выделить временную папку файлы:Где CGI.pm обычно создает временные файлы?

    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. Спасибо, в любом случае.

    @Chris:

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

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

    ответ

    8

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

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

    1

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

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

    2

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

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

    Смежные вопросы