Где CGI.pm обычно создаются временные файлы?

StackOverflow https://stackoverflow.com/questions/86175

  •  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 с одного из рабочих серверов на этот компьютер, но без особой радости.

@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, даже несмотря на то, что эта папка не существовала, и почему она волшебным образом снова начала работать.

Это было полезно?

Решение

Имя временного каталога хранится в $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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top