我正在构建一个网站,其中包含大量响应性的大型图像,以便手机可以看到该图像的小版本和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上生成缩略图,但这并不能解决问题。
有什么想法吗?
答案 0 :(得分:2)
您应该能够使用yml中的class_for_file_extension
覆盖哪个类用于不同的扩展名。默认情况下,File类不会生成任何缩略图,因此通过强制这些文件扩展名使用File类,您应该在上传图像时绕过缩略图创建。
---
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)也会停止重采样。