2015-05-13 39 views
5

我使用的是Concrete5,我试图显示各种上传文件的缩略图。虽然其中一些可能是图像,但大多数是PDF。具体5:将文件缩略图设置为生成的图像(例如PDF)

我目前使用:

<?php 
$file = File::getByID($fID); 
$imageHelper = Core::make('helper/image'); 
try { 
    $imageHelper->outputThumbnail($file, 200, 200); 
} catch(InvalidArgumentException $e) { ?> 
    <img src='https://placehold.it/200x200'> 
<?php } ?> 

我更喜欢以某种方式创建PDF文件的缩略图更小,例如通过在后台使用ghostscript的。在内置的文件管理器中,至少会显示一个PDF图标。这将是一个非理想的选择,但仍然比不显示任何东西来表示我们正在处理PDF。

如何访问内置缩略图?而且,更重要的是,如何在上传时适当覆盖某些文件类型?

编辑:

我碰到$file->getThumbnailURL('type');,创造了我自己的目的的类型。如何在文件上传时自动生成这样的缩略图?我可能会想出如何用纯PHP生成文件,但将其存储在Concrete5中是我不确定的事情。

+0

我不知道C5是否支持这个有趣的问题。如果不能解决问题,您可以考虑自己处理缩略图生成,生成并将它们存储在单独的目录中。 –

+0

@Pekka我确实认为这有点..我注意到有一个'on_file_add'事件挂钩。你会如何建议将缩略图与文件相关联?根据文件ID创建一个目录结构?或者我可以以某种方式设置自定义缩略图类型的位置?感谢您提出这个! – Joost

回答

2

最后,我是这么做的。

我开始创建我的包中的控制器的配置方法,新的缩略图类型,如下所示:

use Concrete\Core\File\Image\Thumbnail\Type\Type; 

... 

public function configure($pkg) { 
    ... 

    $thumbnailType = new Type(); 
    $thumbnailType->setName(tc('ThumbnailTypeName', 'PDF Thumbnails')); 
    $thumbnailType->setHandle('pdfthumbnails'); 
    $thumbnailType->setWidth(200); 
    $thumbnailType->setHeight(200); 
    $thumbnailType->save(); 
} 

然后,我创建了一个类mypackage/src/document_processing/pdfthumbnails.php具有以下内容:

namespace Concrete\Package\Mypackage\Src\DocumentProcessing; 

use Core; 
use File; 
use Concrete\Core\File\Image\Thumbnail\Type\Type; 

class Pdfthumbnails { 

    public function processPDFThumbnails($fv) { 
     $fi = Core::make('helper/file'); 
     $fvObj = $fv->getFileVersionObject(); 
     $ext = $fi->getExtension($fvObj->getFilename()); 
     $file = $fvObj->getFile(); 
     if ($ext == 'pdf') { 
      $type = Type::getByHandle('pdfthumbnails'); 
      $basetype = $type->getBaseVersion(); 
      $thumbpath = $basetype->getFilePath($fvObj); 

      $fsl = $file->getFileStorageLocationObject()->getFileSystemObject(); 
      $fre = $fvObj->getFileResource(); 
      // this requires sufficient permissions.. 
      // depending on your setup, reconsider 0777 
      mkdir('application/files'.dirname($thumbpath), 0777, true); 
      exec('gs -o application/files'.escapeshellarg($thumbpath).' -dPDFFitPage -sDEVICE=png16m -g200x200 -dLastPage=1 -f application/files/'.escapeshellarg($fre->getPath())); 
     } 
    } 
} 

然后我在我的包裹控制器中登录了on_file_version_add事件:

use Concrete\Package\Mypackage\Src\DocumentProcessing\Pdfthumbnails; 

... 

    public function on_start() { 
     Events::addListener('on_file_version_add', array(new Pdfthumbnails(), 'processPDFThumbnails')); 
    } 
1

这似乎是可能的内部C5毕竟,使用file inspectors

一个文件导入到Concrete5(其通过文件进口商类的实例发生的),可能通过可选的运行的任何时间文件检查器,这是一个PHP类,可当他们上载或重新扫描文件上督察

的更多信息,并实现示例对特定类型的文件执行其他操作,可以发现in the C5 documentation.

this Concrete5 forum discussion中,有人似乎已经使用此功能来精确构建您想要构建的内容,即使用ImageMagick生成PDF的缩略图生成器。

该用户的示例代码有两件事。首先,它会注册一个新的自定义文件检查器和正在运行的C5实例。然后,您的自定义检查器库被添加到项目中。

+1

不错,看起来很整齐!谢谢。我会试试看,并会回报:) – Joost

+0

我结束了使用这个挂钩到file_add_version事件,并且工作正常。不过,问题仍然在于实际_storing_生成的缩略图。这似乎并没有在那里解决。 – Joost