Загрузка файла в папку на несколько уровней выше - PHP - PullRequest
0 голосов
/ 05 марта 2020

Извините, я не смог описать свой вопрос в качестве названия, я изо всех сил стараюсь правильно сформулировать проблему. У меня есть скрипт add-new-post.php, который добавляет новый пост в блог. Я борюсь с процессом загрузки файла, так как файл загрузки находится на расстоянии нескольких уровней от сценария, который выполняет загрузку.

Расположение файлов:

public_html/content/uploads/imgs 
public_html/content/themes/admin-cm/post/add-new-post.php

Итак, скрипт пытается загрузить файлы в первый каталог. Ниже приведен соответствующий фрагмент о загрузке файла, в данный момент я просто заставляю его отображать некоторую информацию на странице, чтобы я мог видеть, что происходит:

        if ( !empty( $_FILES[ "featured_image" ][ "name" ] ) ) {

            $target_dir = '/content/uploads/imgs/';
            $target_file = dirname(__FILES__, 4 ) . $target_dir . basename( $_FILES[ "featured_image" ][ "name" ] );
            $upload_ok = 1;
            $image_file_type = strtolower( pathinfo( $target_file, PATHINFO_EXTENSION ) );

            $check = getimagesize( $_FILES[ "featured_image" ][ "tmp_name" ] );

            if ( $check !== false ) {

                echo "File is an image - " . $check[ "mime" ] . ".";
                echo "<br>" . $target_file;
                $upload_ok = 1;

            } else {

                $errors[] = "The uploaded file is not an image.";
                $upload_ok = 0;

            }

            if ( file_exists( $target_file ) ) {

                echo "Sorry, this file already exists.";
                $upload_ok = 0;

            } else {

                echo "<br>This image doesn't exist already.";

            }

            if ( $_FILES[ "featured_image" ][ "size" ] > 500000 ) {

                echo "Sorry, your file is too large.";
                $upload_ok = 0;

            }

            if ( $upload_ok ) {

                if ( move_uploaded_file( $_FILES[ "featured_image" ][ "name" ], $target_file ) ) {

                    echo "<br>Successfully uploaded the image.";

                } else {

                    echo "<br>Couldn't upload the image.";

                }

            }

        }

Я предполагаю, что моя проблема заключается в каталог, я пробовал несколько разных способов ввода целевого каталога, и, похоже, ни один из них не работает (например, сначала ввод переменной $target_file в виде строки ie. "../../../../content/uploads/imgs) Я проверяю это, пытаясь загрузить файл, который в настоящее время существует в каталоге загрузки, и вот что напечатано на странице:

File is an image - image/jpeg.
./content/uploads/imgs/post-img-8.jpg
This image doesn't exist already.
Couldn't upload the image.

Для меня целевой каталог выглядит правильно .. Я ' Мы также пытались substr() потерять точку и пытались потерять ./. Есть идеи, что я делаю не так?

решено (спасибо Мартину в комментариях):

Я заменил следующее:

$target_dir = '/content/uploads/imgs/';
$target_file = dirname(__FILES__, 4 ) . $target_dir . basename( $_FILES[ "featured_image" ][ "name" ] );

на:

$target_dir ="content/uploads/imgs/";
$target_file = $_SERVER[ "DOCUMENT_ROOT" ] . $target_dir . basename( $_FILES[ "featured_image" ][ "name" ] );

1 Ответ

0 голосов
/ 05 марта 2020

Вы должны использовать $_SERVER['DOCUMENT_ROOT'], чтобы установить абсолютный путь к файлу для сохранения файлов в файловой системе вашего сервера.

$_SERVER['DOCUMENT_ROOT'] обычно равен /user/domain/public_html, и внутри этой папки находится мир -доступный сайт;

https://www.mywebsite.co.uk/somefolder/somefile.php

То же, что и:

$_SERVER['DOCUMENT_ROOT']."/somefolder/somefile.php";

Поэтому, чтобы сохранить файл в: www.mywebsite.org/content/uploads/imgs/post-img-8.jpg, вы бы сохранили его в $_SERVER['DOCUMENT_ROOT']."/content/uploads/imgs/post-img-8.jpg";

  • Это универсально, независимо от того, с какой части вашего сайта запускается этот код.

Замечания по безопасности:

  • НЕ сохраняйте файлы с заданным значением $_FILES[ "featured_image" ][ "name" ], это значение может быть легко взломано и должно быть как минимум Regex, чтобы удалить любые недопустимые символы.

    • Пример: $name = preg_replace('/[^a-z0-9_-]/i','',$_FILES['featured_image']['name']);
  • НЕ доверяйте загруженным MIME-типам. Даже getimagesize может быть скомпрометировано. Лучшее предложение - использовать функции PHP fileinfo .

...