PHP: проблема с размером файла

Мне нужна небольшая помощь здесь:

Я получаю файл из формы загрузки HTML. И у меня есть "целевое" имя файла в $File.

Когда я делаю это:

copy($_FILES['binfile']['tmp_name'], $File);
echo '<hr>' . filesize($_FILES['binfile']['tmp_name']);
echo '<hr>' . filesize($File);

Все работает нормально. Я получаю одно и то же число дважды.

Однако, когда я удаляю первый вызов filesize(), я получаю "0" (ноль).

copy($_FILES['binfile']['tmp_name'], $File);
echo '<hr>' . filesize($File);

Какие-либо предложения? Что я делаю неправильно? Почему мне нужно получить размер файла «исходного» файла, прежде чем я смогу получить размер копии?

(На самом деле это так: мне нужно вызвать filesize() для исходного файла. Ни sleep(), ни вызов filesize() другого файла помогает.)

Система:

  • Апач 2.0
  • PHP 5.2.6
  • Debian Linux (Ленни)

person BlaM    schedule 09.04.2010    source источник
comment
Не используйте copy; вместо этого используйте move_uploaded_file.   -  person Gumbo    schedule 09.04.2010
comment
@Гамбо: Круто. Не знал, что такая функция существует. Кажется, решает и мою проблему.   -  person BlaM    schedule 09.04.2010
comment
Вы проверяли подобное поведение на другой установке?   -  person zaf    schedule 09.04.2010
comment
@zaf Я пытался сделать copy () и следующий размер файла () с файлами, которые уже существуют в системе. Нет проблем. Однако на другом сервере не пробовал.   -  person BlaM    schedule 09.04.2010


Ответы (3)


Насколько велик этот файл? Вы делаете копию, а затем сразу указываете файл. Может ли это быть проблемой?

Имеет ли встроенная функция move_uploaded_file() такое же поведение?

person zaf    schedule 09.04.2010
comment
Всего 300кб. Похоже, это не проблема времени, потому что сон не помогает. - person BlaM; 09.04.2010
comment
Это странно. Было бы интересно узнать, что здесь происходит. - person zaf; 09.04.2010
comment
Принял этот ответ, потому что move_uploaded_file решает мою проблему. - person BlaM; 09.04.2010

Попробуй это:

copy($_FILES['binfile']['tmp_name'], $File);
clearstatcache();
$filesize = $_FILES['binfile']['size'];
echo '<hr>' . $filesize;
person SoLoGHoST    schedule 09.04.2010
comment
Просто поверьте мне, что у него есть значение — и оно имеет другое значение, чем tmp_name, потому что, очевидно, я не хочу копировать файл в себя. - person BlaM; 09.04.2010
comment
Потому что этот код — это то, к чему я свел свою проблему. Я использую библиотеку, которая требует, чтобы имя файла имело расширение .jpg. - person BlaM; 09.04.2010
comment
clearstatcache() помогает. Я бы не смог использовать $_FILES...['size'], потому что, как я уже сказал, есть другая библиотека, и эта библиотека использует размер файла где-то глубоко внутри. - person BlaM; 09.04.2010
comment
Ну, вы могли бы создать функцию, которая могла бы спать, пока file_exist не вернет true. Если функция file_exists($File) возвращает значение true, выполните filesize($File); - person SoLoGHoST; 09.04.2010

Как насчет этого:

copy($_FILES['binfile']['tmp_name'], $File);

clearstatcache();
while (empty(filesize($File)))
    sleep(2);

echo '<hr>' . filesize($File);

ИЛИ попробуйте это:

copy($_FILES['binfile']['tmp_name'], $File);

clearstatcache();
while (!file_exists($File))
    sleep(2);

echo '<hr>' . filesize($File);
person SoLoGHoST    schedule 09.04.2010