1

我正在建立一个网站,其中包含大量要响应式提供的大图像,以便手机可以看到该图像的小版本,而 4k 显示器可以看到该图像的大版本。其目的是允许 SilverStripe 中的作者上传大小为 4000 像素 x 3000 像素甚至更大的图像,然后将其传递给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 可能只尝试在图像而不是文件上生成缩略图,但这并不能解决问题。

有任何想法吗?

4

2 回答 2

2

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

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

将文件扩展名的类设置为文件而不是图像是不够的,因为 DBFile 会执行自己的“是图像”检查(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 )也会停止重新采样。

于 2018-01-09T22:04:32.123 回答
2

您应该能够覆盖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

于 2018-01-08T02:58:39.690 回答