簡體   English   中英

如何阻止SilverStripe 4在文件上傳時自動生成圖像縮略圖?

[英]How to stop SilverStripe 4 from autogenerating image thumbnails on file upload?

我正在建立一個網站,其中包含很多大圖片,這些圖片將得到及時響應,以便手機可以看到該圖片的小版本,而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類,以為SilverStripe可能只嘗試在Images而不是File上生成縮略圖,但這不能解決問題。

有任何想法嗎?

您應該能夠使用class_for_file_extension中的class_for_file_extension覆蓋用於不同擴展名的類。 默認情況下,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

除了按照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 )也會停止重新采樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM