Как остановить SilverStripe 4 от автоматического создания миниатюр изображений при загрузке файла?

Я создаю веб-сайт с большим количеством больших изображений, которые нужно быстро реагировать, чтобы мобильный телефон мог видеть маленькую версию этого изображения, а монитор 4k — большую версию этого изображения. Намерение состояло в том, чтобы позволить автору в SilverStripe загружать изображения, размер которых может достигать 4000px x 3000px, или даже больше, а затем передавать их в службу типа imgix сделать тяжелую работу по изменению размера изображения и сжатию, для того, чтобы быстро подать изображение в тему.

Однако загрузка изображений такого размера вызывает ошибки памяти PHP на большинстве хостинговых сред, и это потому, что SilverStripe автоматически обработает изображение и сгенерирует несколько миниатюр для административного интерфейса. Я хотел бы отключить генерацию миниатюр, чтобы изображение загружалось — в полном размере — и не обрабатывалось повсеместно, чтобы не рисковать ошибками памяти PHP, которые могут возникнуть при обработке изображений на сервере.

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

<?php

namespace MyProject;

use SilverStripe\ORM\DataObject;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\TabSet;
use SilverStripe\Assets\File;
use SilverStripe\AssetAdmin\Forms\UploadField;
use Page;

class Project extends DataObject
{
private static $has_one = [
'Photo' => File::class
];

private static $owns = [
'Photo'
];

public function getCMSfields()
{
$fields = FieldList::create(TabSet::create('Root'));

$fields->addFieldsToTab('Root.Presentation', [
$photoUpload = UploadField::create('Photo', 'Photo')
]);

$photoUpload->getValidator()->setAllowedExtensions(array(
'png','jpeg','jpg'
));
$photoUpload->setFolderName('photos');

return $fields;
}
}

Я попытался использовать класс File вместо класса Image для своего поля Photo, полагая, что SilverStripe может пытаться создавать только эскизы изображений, а не файлов, но это не помогает.

Есть идеи?

1

Решение

Вы должны иметь возможность переопределить, какой класс используется для различных расширений, используя class_for_file_extension в вашем yml. По умолчанию класс File не создает никаких миниатюр, поэтому, заставляя эти расширения файлов использовать класс File, вы должны обходить создание миниатюр при загрузке изображений.

Например. https://github.com/silverstripe/silverstripe-asset-admin/blob/1.0/code/Controller/AssetAdmin.php#L1159

---
Name: myproject
---
SilverStripe\Assets\File:
class_for_file_extension:
'jpg': SilverStripe\Assets\File
'jpeg': SilverStripe\Assets\File
'png': SilverStripe\Assets\File
'gif': SilverStripe\Assets\File
'bmp': SilverStripe\Assets\File
'ico': SilverStripe\Assets\File

НОТА: Из-за того, как SilverStripe обрабатывает настройку этих полей (слияние), вам нужно переопределить все типы изображений по умолчанию, а не просто устанавливать подстановочный знак.

Например. https://github.com/silverstripe/silverstripe-assets/blob/1.0/src/File.php#L210

2

Другие решения

В дополнение к переопределению класса, используемого для расширений файлов изображений, согласно ответу Бретта, вы также должны предотвратить принудительное изменение класса DBFile путем редактирования yml-файла вашего сайта:

---
Name: myproject
---
SilverStripe\Assets\Storage\DBFile:
force_resample: false

Установка класса для расширения файла вместо file не достаточно, потому что DBFile выполняет свою собственную проверку «is image» (https://github.com/silverstripe/silverstripe-assets/blob/1.0/src/Storage/DBFile.php#L90) который игнорирует какой класс вы установили расширение файла.

Так что предотвращение принудительной выборки (https://github.com/silverstripe/silverstripe-assets/blob/1.0/src/ImageManipulation.php#L282) остановит повторную выборку, даже если DBFile определил, что базовый файл является физически изображением.

2

По вопросам рекламы [email protected]