Узнать где папка TMP

Greendrake

Новичок
Узнать где папка TMP

В скрипте нужно определять где хранятся временные файлы при аплоаде.

ini_get("upload_tmp_dir") - пусто
$_ENV['TMP'], $_ENV['TEMP'] - пусто

Фактически они хранятся в /var/tmp (узнал, подсмотрев $_FILES['userfile']['tmp_name']).
В инфе, выдаваемой phpinfo() этого значения НЕТ.
Система FreeBSD.

Так откуда это значение берётся и как в скрипте его узнать? Ничего лучше не приходит кроме как CURLом отсылать самому себе файл и подглядывать $_FILES['userfile']['tmp_name'], но это же маразм....
 

SiMM

Новичок
> В скрипте нужно определять где хранятся временные файлы при аплоаде.
Зачем?
 

Greendrake

Новичок
Автор оригинала: SiMM
> В скрипте нужно определять где хранятся временные файлы при аплоаде.
Зачем?
Есть маза решить-таки проблему с прогресс-баром при аплоаде файлов, для этого нужно лазить по папке куда они грузятся. Но давайте о сабже.


Кстати, массив $_ENV вообще пустой - может где настройка какая есть, которая его включает?
 

squirell

Новичок
Юзай директиву upload_tmp_dir в файле php.ini.

Она содержит каталог для временных файлов, в который PHP помещает закачанные файлы. Если в директиве указана пустая строка - используется системный временный каталог, что ты и наблюдал.
 

Greendrake

Новичок
>используется системный временный каталог, что ты и наблюдал.
дык мне и нужно узнать этот каталог.
Я узнал его, только передав файл через форму. А без этого как узнать?
 

SiMM

Новичок
> Есть маза решить-таки проблему с прогресс-баром при аплоаде файлов
Кстати, у тебя туда доступа, если не ошибаюсь, может и не быть.
 

boombick

boombick.org
по дефолту на /tmp стоят права 0777...
Только обычно админы ставят noexec
 

squirell

Новичок
Автор оригинала: Greendrake
>используется системный временный каталог, что ты и наблюдал.
дык мне и нужно узнать этот каталог.
Я узнал его, только передав файл через форму. А без этого как узнать?
А ты часто видел системные временные каталоги отличные от /tmp?
 

Greendrake

Новичок
Автор оригинала: squirell
А ты часто видел системные временные каталоги отличные от /tmp?
Да, на винде они обычно другие. А разрабатываю и тестирую я на винде, при этом стремлюсь писать как можно более универсальный код.
Да и зачем гадать? Временный каталог должен быть узнаваемым для скриптов. Походу, в ядро пхп это встроено, но для скриптёра не доступно :rolleyes:
 

Gorynych

Посетитель PHP-Клуба
Greendrake

кроме 'TMP' и 'TEMP' еще есть ключ 'TMPDIR' (см. $_ENV['TMPDIR'] ), но тут Вас где-то проскользнуло утверждение о том, что массив $_ENV пуст. Это действительно так?

P.S. собственно имя пременной окружения, отвечающей за директорию для временных файлов зависит от ОС. так что для "универсальности" стоит просмотреть массив на наличие элементов с ключаи напчинающимися с "TMP" или "TEMP" - что-то вроде /^TE?MP/

-~{}~ 17.08.06 13:25:

а, ну да... WINDOWS... Ок, есть, конечно, еще один не совсем очевидный способ, но он несколько стремный, и мне не хочется его озвучивать :) Посему - напишем чуть длиннее.

если у нас Win, то давайте это диогностируем и добавим нужное значение в массив $_ENV (который под Windows действительно пустоват):

Код:
if ( preg_match("/^[a-z]:/[b]i[/b]", __FILE__) && !isset($_ENV['TMPDIR']) ) {
    $_ENV['TMPDIR'] = preg_replace("/^(.+)=(.+)$/", '$2', exec("SET TEMP"));
}

foreach($_ENV as $k => $v) {
    if ( preg_match("/^TE?MP/", $k) ) {
        echo "$k = $v\n";
    }
}
P.S. на всякий случай добавил i в регулярку, хотя и без него в данном случае должно срабатывать.
 

GemVit

Новичок
Хм, $_ENV пуст, а если getenv('TMP') ?
у меня:
$_ENV['TMP'] > undefined index
getenv('TMP') > C:\WINDOWS\TEMP
 

Greendrake

Новичок
>массив $_ENV пуст. Это действительно так?

Да, пуст. Причём на FreeBSD пуст. Уж не знаю как это нужно было так настроить.
На винде-то проблем нет. Просто мне нужен универсальный код, работающий и там и там.
 

440hz

php.ru
Greendrake

RTFM

string tempnam ( string dir, string prefix )


Создаёт файл с уникальным именем в определённой директории. Если эта директория не существует, tempnam() попытается создать файл во временной директории системы и вернуть его имя.


распарсить-то string сможем самостоятельно? =)

-~{}~ 17.08.06 23:12:

На винде-то проблем нет
яя ... охотно верю ...
 

SiMM

Новичок
> string tempnam ( string dir, string prefix )
> Создаёт файл с уникальным именем
Какой-то кривой перевод, однако.
PS: первым параметром наверно имеет смысл указывать что-то типа "\n", чтобы не гадать ;)
 

440hz

php.ru
Какой-то кривой перевод, однако
взято из официальной доки, может просто старая?
http://php.ru/manual/function.tempnam.html

-~{}~ 17.08.06 23:28:

первым параметром наверно имеет смысл указывать что-то типа "\n", чтобы не гадать
хороший вопрос ... =) ща умники посыпят предложениями.
 

SiMM

Новичок
> взято из официальной доки
Я в курсе, просто обратил внимание.
 

Greendrake

Новичок
440hz, респект!

итак, решение:

function getTmpDir(){
$tmpfile = tempnam("\n","w");
unlink($tmpfile);
return dirname($tmpfile);
};
 

SiMM

Новичок
> unlink($tmpfile);
В этом нет необходимости ;) Даже если бы такой файл создался - вы бы не получили временную директорию и функция была бы нерабочей.
 

Greendrake

Новичок
>Даже если бы такой файл создался - вы бы не получили временную директорию и функция была бы нерабочей. [/QUOTE]

Сорри, не понял.
Что значит "даже если бы?". Почему не получил бы директорию?
Этот файл создаётся. И его нужно удалить чтобы не засорять сервер.
 
Сверху