如何阻止SilverStripe 4在文件上传时自动生成图像缩略图?

时间:2018-01-05 20:03:42

标签: php image silverstripe 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类,而不是我的Photo字段的Image类,认为SilverStripe可能只尝试在Images而不是Files上生成缩略图,但这并不能解决问题。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

您应该能够使用yml中的class_for_file_extension覆盖哪个类用于不同的扩展名。默认情况下,File类不会生成任何缩略图,因此通过强制这些文件扩展名使用File类,您应该在上传图像时绕过缩略图创建。

E.g。 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处理这些字段(合并)的设置,您需要覆盖所有默认图像类型,而不仅仅是设置通配符。

E.g。 https://github.com/silverstripe/silverstripe-assets/blob/1.0/src/File.php#L210

答案 1 :(得分:2)

除了根据Brett的答案覆盖用于图像文件扩展名的类之外,还必须通过编辑站点yml文件来阻止DBFile类强制重新取样:

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

将文件扩展名的类设置为文件而不是图像是不够的,因为DBFile自己做了&#34;是图像&#34;检查(https://github.com/silverstripe/silverstripe-assets/blob/1.0/src/Storage/DBFile.php#L90),忽略您已将文件扩展名设置为的类。

因此,即使DBFile已确定基础文件在物理上是图像,阻止重新采样被强制(https://github.com/silverstripe/silverstripe-assets/blob/1.0/src/ImageManipulation.php#L282)也会停止重采样。