Как решить эту проблему Laravel - файл "/ tmp / phpY14gRo" не существует или недоступен для чтения? - PullRequest
1 голос
/ 09 октября 2019

Мне нужно создавать миниатюру PDF каждый раз, когда он загружается методом POST. Как только я загружаю файл в Controller , он запускает getThumb функцию, которая использует Imagick для создания эскиза. Проблема заключается в том, что каждый раз, когда я делаю это, этот запрос прерывается и показывает эту ошибку - Файл "/ tmp / phpY14gRo" не существует или недоступен для чтения. .

Imagick установлен правильно. Я использую php-7.2-apache образ докера.

Но если я запускаю shell_excec скрипт, который делает абсолютно то же самое, он работает! Это устраняет все подозрения о неправильной установке зависимостей

Вот функция моего контроллера:


    public function createThumb($source, $target, $size = 256, $page = 1)
    {

        if (file_exists($source) && !is_dir($source)): // source path must be available and not be a directory
            if (mime_content_type($source) != 'application/pdf'):
                return FALSE;                // source is not a pdf file returns a failure
            endif;

            $sepa = '/';                // using '/' as file separation for nfs on linux.
            $target = dirname($source) . $sepa . $target;
            $size = intval($size);            // only use as integer, default is 256
            $page = intval($page);            // only use as integer, default is 1

            $page--;                    // default page 1, must be treated as 0 hereafter
            if ($page < 0) {
                $page = 0;
            }            // we cannot have negative values


//It breaks exactly right here

            $img = new Imagick($source . "[$page]"); // [0] = first page, [1] = second page


            $imH = $img->getImageHeight();
            $imW = $img->getImageWidth();
            if ($imH == 0) {
                $imH = 1;
            }            // if the pdf page has no height use 1 instead
            if ($imW == 0) {
                $imW = 1;
            }            // if the pdf page has no width use 1 instead

            $sizR = round($size * (min($imW, $imH) / max($imW, $imH))); // relative pixels of the shorter side

            $img->setImageColorspace(255);        // prevent image colors from inverting
            $img->setImageBackgroundColor('white');    // set background color and flatten
            $img = $img->flattenImages();            // prevents black zones on transparency in pdf
            $img->setimageformat('jpeg');

            if ($imH == $imW) {
                $img->thumbnailimage($size, $size);
            }    // square page
            if ($imH < $imW) {
                $img->thumbnailimage($size, $sizR);
            }    // landscape page orientation
            if ($imH > $imW) {
                $img->thumbnailimage($sizR, $size);
            }    // portrait page orientation

            if (!is_dir(dirname($target))) {
                mkdir(dirname($target), 0777, true);
            } // if not there make target directory

            $img->writeimage($target);
            $img->clear();
            $img->destroy();

            if (file_exists($target)) {
                return $target;
            } // return the path to the new file for further processing
        endif;

        return FALSE;    // the source file was not available, or Imagick didn't create a file, so returns a failure
    }

Я думал, что это были проблемы с правами доступа, но обнаружил, что это не так.

Обновление:

Если я инициализирую Imagick без параметров, это не вызовет ошибок и, следовательно, не создаст миниатюру, поскольку не получает путь к файлу. Поэтому всякий раз, когда я добавляю путь к файлу, PHP начинает поиск этого файла, и возникает ошибка. Внутри журнала я заметил, что исключение InvalidArgumentException было сгенерировано фреймворком Symfony .

Вот изображение ошибки: enter image description here

Ответы [ 2 ]

0 голосов
/ 21 октября 2019

В моем случае я звоню $validator->fails() два раза.

В моем случае первый вызов $validator->fails() в моем действии контроллера после проверки удалил файл. Второй вызов не смог найти этот файл.

0 голосов
/ 10 октября 2019

После отладки я обнаружил, что Imagick не был импортирован в проект. Итак, я просто добавил use Imagick в верхней части моего контроллера .

...