как я могу сделать файл изображения загружаемым с сервера apache с помощью php?

Не знаю, спрашивали ли об этом раньше, заранее прошу прощения.

Я создал веб-приложение для сжатия изображений с помощью API tinyPNG, и оно работает так, как задумано, то есть пользователи могут загружать файл изображения, а он сжимается и сохраняется на сервере.

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

При переходе по ссылке на скачивание выдает ошибку:

не могу найти файл по адресу http://localhost/var/www/html/imgtest/uploads/67403938_10219921906785196_7063388762713096192_n_1574687362.jpg.

Даже если сжатый образ находится на сервере.

Пожалуйста помоги!!!

МОЙ КОД:

require_once("vendor/autoload.php");

//makes PHP execute faster
set_time_limit(0);

//API key
\Tinify\setKey("API_KEY_HERE");

//Main code
if (isset($_POST['submit'])) {

    //supported image formats.
    $supported_image = array('image/jpg', 'image/jpeg', 'image/png');

    foreach($_FILES['images']['name'] as $key=>$val){

        $file_name = $_FILES['images']['name'][$key];

        // get file extension
        $ext = strtolower(pathinfo($file_name, PATHINFO_EXTENSION));

        // get filename without extension
        $filenamewithoutextension = pathinfo($file_name, PATHINFO_FILENAME);

        if (in_array($_FILES['images']['type'][$key], $supported_image)) {

            if (!file_exists(getcwd(). '/uploads')) {

                $oldmask = umask(0);

                mkdir(getcwd(). '/uploads', 0777, true);

                umask($oldmask);
            }

            $filename_to_store = $filenamewithoutextension. '_' .time(). '.' .$ext;
            move_uploaded_file($_FILES['images']['tmp_name'][$key], getcwd(). '/uploads/' .$filename_to_store);


            $compress_file = getcwd(). '/uploads/' .$filename_to_store;

            // optimize image using TinyPNG
            try {
                $source = \Tinify\fromFile(getcwd(). '/uploads/' .$filename_to_store);
                $source->toFile(getcwd(). '/uploads/' .$filename_to_store);

                //The code to show a modal for downloading the converted file.


            } catch(Exception $e) {
                echo $e->getMessage();
                exit;
            }
        }
    }

    echo "<a href=".$compress_file." download>Download</a>";
}

?>```

person y0ung0d    schedule 25.11.2019    source источник


Ответы (1)


Проблема в вашем коде в том, что вы создаете ссылку с $compress_file, которая содержит абсолютный путь к файлу.

/var/www/html/imgtest/uploads/67403938_10219921906785196_7063388762713096192_n_1574687362.jpg

Итак, когда ссылка нажимается и URL-адрес разрешается в браузере, результат

HTTP: // локальный / вар / WWW / HTML / imgtest / добавления / 67403938_10219921906785196_7063388762713096192_n_1574687362. jpg.

Итак, если домен localhost указывает на /var/www/html/imgtest/, сервер ищет файл по этому пути, которого не существует:

/var/www/html/imgtest/var/www/html/imgtest/uploads/...

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

$compress_file_url = '/uploads/' .$filename_to_store;
$compress_file = getcwd(). $compress_file_url;

Тогда вам следует использовать $compress_file_url вместо $compress_file при создании ссылки.

echo "<a href=\"$compress_file_url\" download>Download</a>";

Это должно работать, если ваш домен localhost указывает на /var/www/html/imgtest. Если ваш домен localhost указывает на /var/www/html, вам может потребоваться добавить $compress_file_url к /imgtest, прежде чем он будет использоваться для создания ссылки.

$compress_file_url = '/uploads/' .$filename_to_store;
$compress_file = getcwd(). $compress_file_url;
$compress_file_url = '/imgtest' . $compress_file_url;
person Michal Hynčica    schedule 25.11.2019
comment
Спасибо, это сработало: вместо этого я использовал $compress_file_url = '/imgtest' . $compress_file_url;. Еще раз спасибо за оперативную помощь. - person y0ung0d; 25.11.2019