загрузка файла на сервер и перемещение в папку,папка защищена от записи, рhp

439
09 июня 2017, 12:31

Помогите разобраться, вопрос/проблема вот в чём:

в папке webroot/uploads/ не появляется файл который загружается на сервер, хотя путь прописан, сама функция перемещения никаких ошибок не выдает...

странность еще в том что в папке webroot появляется файл $full_path, с набором просто цифр...

сам путь в базе сохраняется всё корректно (в виде: webroot/uploads/1496868491.png)

решил глянуть var_dump($_FILES['img_file']);

array(5) {
  ["name"]=>
  string(6) "t1.png"
  ["type"]=>
  string(9) "image/png"
  ["tmp_name"]=>
  string(50) "C:\openserver\OpenServer\userdata\temp\php5875.tmp"
  ["error"]=>
  int(0)
  ["size"]=>
  int(2387)
}

сам код.

path = 'webroot/uploads/'; // директория для загрузки
        $ext = array_pop(explode('.',$_FILES['img_file']['name'])); // расширение
        $new_name = time().'.'.$ext; // новое имя с расширением
        $full_path = $path.$new_name; // полный путь с новым именем и расширением
        echo "<pre>"; 
        echo var_dump($_FILES['img_file']);
        echo "</pre>";
        if($_FILES['img_file']['error'] == 0){
            if(move_uploaded_file(($_FILES['img_file']['tmp_name']), '$full_path')){,,,,}

В поисках решения наткнулся на совет проверить папку на запись

if (!is_writable($path)) {
                die("Запись в каталог запрещена");
} else {if(move_uploaded_file(....)){...}

Так вот проверка выдала что $path, защищен от записи, кто знает как дать разрешение на запись? (вопрос в том что можно сделать это через cmd, или же с помощью средств php)

Answer 1

добавил по совету (B. Bohdan) к переменной пути следующее $_SERVER["DOCUMENT_ROOT"].

получилось так

$path = $_SERVER['DOCUMENT_ROOT']."/webroot/uploads/";

!update! после таких манипуляций при вызове адреса картинки из базы, сама картинка не подтягивалась из дериктории т.к путь был следующего вида

C:/openserver/OpenServer/domains/localhost/webroot/uploads/1496908169.png

соответственно это не удовлетворяло конечную цель.

после редактирования получил следующий код.

$path = "/webroot/uploads/"; // директория для загрузки
        $ext = array_pop(explode('.',$_FILES['img_file']['name'])); // расширение
        $new_name = time().'.'.$ext; // новое имя с расширением
        $full_path = $path.$new_name; // полный путь с новым именем и расширением
        /*echo "<pre>"; 
        echo var_dump($path);
        echo "</pre>";*/
        if($_FILES['img_file']['error'] == 0){
            if(move_uploaded_file($_FILES['img_file']['tmp_name'], $_SERVER['DOCUMENT_ROOT'].$full_path)){
                // Если файл успешно загружен, то вносим в БД 
                // Можно сохранить $full_path (полный путь) или просто имя файла - $new_name

в моём случае всё заработало, и теперь изображения попадают в папку (C:/openserver/OpenServer/domains/localhost/webroot/uploads/1496908169.png) , а путь к ним записывается в базу в таком виде (/webroot/uploads/1496909914.png) =)

Answer 2

Работа этой суперглобальной переменной зависит от правильности настроек сервера. Ее использование рекомендовано стандартом.

Answer 3

Зачем '$full_path' в последней строке оборачивать в одинарные кавычки? Я делаю вот так:

//куда загружать?
$dir = $_SERVER["DOCUMENT_ROOT"] . "/webroot/uploads";
//имя файла (с расширением)
$name = basename($_FILES["img_file"]["name"]);
//расширение файла
$ext = array_pop(explode(".", $name));
//новое имя (с расширением)
$new_name = time() . "." . $ext;
//постоянное место хранения файла
$file_dir = $dir . DIRECTORY_SEPARATOR . $new_name;
//временное место хранения файла
$tmp_name = $_FILES["img_file"]["tmp_name"];
//переместить файл в постоянное место хранения
if (is_uploaded_file($tmp_name) && move_uploaded_file($tmp_name, $file_dir)) {
    echo "Файл успешно загружен по такому адресу: " . $file_dir;
} else {
    echo "Не удалось загрузить файл по такому адресу: " . $file_dir;
}

А еще лучше — обратитесь к документации, там все подробно описано: php.net

READ ALSO
Обработка определённой области PHP

Обработка определённой области PHP

Как сделать чтобы была обработка определённой области кода в файле indexphp, а другую часть кода он игнорировал

288
PHP BITRIX работа с корзиной

PHP BITRIX работа с корзиной

Нужно, чтобы в поле сумма выводилась сумма заказов из корзины Каким образом это осуществить

250
Не получается вывести массив в таблицу PHP

Не получается вывести массив в таблицу PHP

День добрыйЕсть проблема с выводом массива данных в таблицу

368
Как прикрепить 1 entyti ко многим Entities

Как прикрепить 1 entyti ко многим Entities

Задача создать комментарии для страниц, постов, портфолио

274