Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > закачка файла


Автор: blackbanny 22.5.2013, 07:04
Доброго времени  суток!
написал код для закачки файлов на сервер. move_uploaded_file возвращает true, но файла нет в папке:
Код

$desc = $_POST['desc'];
$file = $_FILES['userfile']['name'];

echo $file . "<br>";
echo $_FILES['userfile']['tmp_name'] . "<br>";

$uploadfile = $_POST['file_path'] . basename($file);
echo $uploadfile . "<br>";;
print_r($_FILES);
echo "<br>";
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
    echo "yes.\n";
} else {
    echo "no!\n";
}

вывод на странице:


file.docx
/tmp/php8c1I8e
/home/bh46714/public_html/no_file/file.docx
Array ( [userfile] => Array ( [name] => file.docx [type] => application/vnd.openxmlformats-officedocument.wordprocessingml.document [tmp_name] => /tmp/php8c1I8e [error] => 0 [size] => 0 ) ) 
yes. 



Автор: ksnk 22.5.2013, 07:18
Так не бывает. 
Единственное разумное объяснение, которое мне пришло в голову - файл на лету пристреливается какой-нибудь особенно хитрой антивирусной защитой. Хитрость ее в то, что она проверяет файл не в момент его размещения во временной папке, а в момент его копирования в ...public_html/no_file. Чтобы полностью исключить этот вариант - загрузи простой текстовый файл с расширением txt

Второе относительно разумное объяснение - файл таки скопировался, но прав на его просмотр нету. Каким образом проверяется наличие файла?

Автор: blackbanny 22.5.2013, 07:29
Цитата(ksnk @ 22.5.2013,  07:18)
Так не бывает. 
Единственное разумное объяснение, которое мне пришло в голову - файл на лету пристреливается какой-нибудь особенно хитрой антивирусной защитой. Хитрость ее в то, что она проверяет файл не в момент его размещения во временной папке, а в момент его копирования в ...public_html/no_file. Чтобы полностью исключить этот вариант - загрузи простой текстовый файл с расширением txt

Второе относительно разумное объяснение - файл таки скопировался, но прав на его просмотр нету. Каким образом проверяется наличие файла?

попробовал txt:
DB.txt
/tmp/phpq5x6hV
/home/bh46714/public_html/no_file/DB.txt
Array ( [userfile] => Array ( [name] => DB.txt [type] => text/plain [tmp_name] => /tmp/phpq5x6hV [error] => 0 [size] => 81 ) ) 
yes. 

файла все равно нет, проверяю - захожу по фтп на хостинг
может из-за хостинга или cms MODx проблема?

Автор: ksnk 22.5.2013, 07:41
Можно после загрузки файла выполнить что-то такое отдельным скриптом
Код

<?php

echo file_exists('/home/bh46714/public_html/no_file/DB.txt')? 'file_exists': 'file no found';


Если скрипт найдет загруженный файл, то нужно будет поправить атрибуты у папки no_file.


Автор: blackbanny 22.5.2013, 07:46
ничего не вывел

Автор: ksnk 22.5.2013, 08:15
а так
Код

<?php
ini_set('display_errors',1);
error_reporting(E_ALL);
echo file_exists('/home/bh46714/public_html/no_file/DB.txt')? 'file_exists': 'file no found';


Предположительно, дело в атрибутах папки. У пользователя FTP нет прав на просмотр загруженного файла, вот его и не показывают.
У пользователя web (или от какого имени там запущен апач) нет прав на чтение файла. можно сохранить файл не в no_file (достаточно зловещее название для папки, не находите  smile ) а в корень сайта, для проверки.

Автор: blackbanny 22.5.2013, 08:24
так то зловеще хД
все равно ничего не выводит, если в корень сохранять: $uploadfile="/";
то:
Warning: move_uploaded_file() [function.move-uploaded-file]: open_basedir restriction in effect. File(/) is not within the allowed path(s): (/home/bh46714:/usr/lib/php:/usr/local/lib/php:/tmp) in /home/bh46714/public_html/add_file.php on line 13

Автор: blackbanny 22.5.2013, 08:39
ситуация следующая...скрипт работает и с таким кодом:
Код

$desc = $_POST['desc'];
$file = $_FILES['userfile']['name'];

echo $file . "<br>";
echo $_FILES['userfile']['tmp_name'] . "<br>";

$uploadfile = $_POST['file_path'] . $file;

echo $uploadfile . "<br>";
print_r($_FILES);
echo "<br>";
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) { 
    echo "yes.\n";
} else {
    echo "no!\n";
}

но по фтп файлов не видно(TC), взял закинул через фтп файл, он отобразился один в папке, потом беру удаляю его(F8), TC обновляют папку и появляется список всех файлов, которые я пытался загрузить с помощью скрипта smile

Добавлено через 6 минут и 6 секунд
только вот скачать нельзя, если по этой http://regexinfo.ru/home/bh46714/public_html/no_file/file.docxперехожу то ошибка 404

Автор: Sanchezzz 22.5.2013, 09:20
В ТС листинг файлов кешится для принудительного обновления нужно жать как в браузере ctrl+r

Автор: ksnk 22.5.2013, 09:25
Цитата(blackbanny @  22.5.2013,  08:39 Найти цитируемый пост)
 TC обновляют папку и появляется список всех файлов, которые я пытался загрузить с помощью скрипта
 Можно пользоваться каким-нибудь online-файловым менеджером для отладки. Он отображают информацию так как видит ее скрипт. Если ftp ходит как web броузер и через прокси - список файлов где-то по пути может закэшироваться и не обновляться.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)