Как сделать миниатюры с Filepond, наряду с загрузкой нормального размера - PullRequest
0 голосов
/ 01 мая 2019

Мне удалось заставить Filepond загружать файлы, помещать их в нужную папку и добавлять необходимые данные в базу данных mysql.Однако, поскольку исходные изображения имеют очень высокое разрешение, мне нужно сделать эскизы.Меньшие версии изображений, которые должны идти в подпапке, называемой «миниатюры».

Я использую плиту PHP, и некоторая документация не описывает используемые там методы.Например, я пытался, просто для тестирования, сделать это:

    FilePond.setOptions({
        maxFileSize: '25MB',
        instantUpload: true,
        server: 'api/',
        imageTransformVariants: {
            'thumb_medium_': transforms => {
                transforms.resize.size.width = 384;
                return transforms;
            },
            'thumb_small_': transforms => {
                transforms.resize.size.width = 128;
                return transforms;
            }
        }

    });
    let pond = FilePond.create(document.querySelector('input[type="file"]'));

, что дает мне эту ошибку:

index.php?id=1383:67 Uncaught (in promise) TypeError: Cannot read property 'size' of undefined
    at thumb_medium_ (index.php?id=1383:67)
    at filepond-plugin-image-transform.js:898
    at filepond-plugin-image-transform.js:987
    at new Promise (<anonymous>)
    at filepond-plugin-image-transform.js:986
    at filepond-plugin-image-transform.js:1066
    at Array.map (<anonymous>)
    at filepond-plugin-image-transform.js:1065
    at new Promise (<anonymous>)
    at filepond-plugin-image-transform.js:941

Очевидно, я мог бы сделать вторую Filepond-загрузку для миниатюрно я подозреваю, что должен быть способ сделать это автоматически.Как заставить варианты работать, а также, как сделать их в другой папке и с тем же именем файла, а не давать им префикс?

1 Ответ

0 голосов
/ 01 мая 2019

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

Может быть, что-то вроде следующего для сжатия изображений на сервере, если вы хотите сделать это самостоятельно?


function compressImage($source, $destination, $newWidth = 384) {

    // get image & details
    $info = getimagesize($source);
    $width = $info[0];
    $height = $info[1];
    $ratio = $width / $height;
    // calculate new heights
    $newHeight = $newWidth / $ratio;
    // create temp blank image
    $compressedImg = imagecreatetruecolor($newWidth, $newHeight);

    if ($info['mime'] == 'image/jpeg') {
        $image = imagecreatefromjpeg($source);
        imagecopyresampled($compressedImg, $image, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);
        // adjust quality if needed
        imagejpeg($compressedImg, $destination, 75);
        return true;
    } elseif ($info['mime'] == 'image/png') {
        $image = imagecreatefrompng($source);
        imagecopyresampled($compressedImg, $image, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);
        // adjust compression if needed (0 not compressed, 9 highest compression)
        imagepng($compressedImg, $destination, 9);
        return true;
    }
    return false;
}

compressImage('/path/to/image/filename.jpg', '/path/to/image/thumbnails/filename.jpg');

Отказ от ответственности - я не проверял этот код

...