在SilverStripe导航中设置链接以自动下载PDF文件

在SilverStripe导航中设置链接以自动下载PDF文件,pdf,silverstripe,Pdf,Silverstripe,我有一些我正在为SilverStripe中的PDF下载页面类型编写的代码,它允许人们将PDF文件上传到后端。然后,该PDF文件作为链接被读取到顶部导航中,单击该链接时,该链接将自动下载PDF文件 我已经设置了大部分代码: <?php class PDFTemplate extends Page { public static $db = array( ); public static $has_one = array( 'PDFFile' =&g

我有一些我正在为SilverStripe中的PDF下载页面类型编写的代码,它允许人们将PDF文件上传到后端。然后,该PDF文件作为链接被读取到顶部导航中,单击该链接时,该链接将自动下载PDF文件

我已经设置了大部分代码:

<?php
class PDFTemplate extends Page {

    public static $db = array(
    );

    public static $has_one = array(
        'PDFFile' => 'File'
    );

    public static $has_many = array(
    );

    public function Link() {
        return '/home/download?ID=' . $this->ID;
    }

    public function getCMSFields() {
        $fields = parent::getCMSFields();

        $fields->addFieldToTab("Root.Main", new UploadField('PDFFile', "PDF File"), "Content");

        return $fields;
    }

}
class PDFTemplate_Controller extends Page_Controller {

    public static $allowed_actions = array (
        'download'
    );

    public function init() {
        parent::init();
    }

    public function download() {
        $id = $_GET['ID'];

        $obj = DataObject::get_by_id('PDFTemplate', $id);

        header('Content-Type: application/pdf');
        header('Content-Disposition: attachment;');
        header('Pragma: no-cache');

        return readfile("");
    }

}

您现在请求的是一个
PDFTemplate
对象,而不是
文件
对象,因此这是一个问题-但是您不需要向该页面传递ID来下载它,因为该页面已经有了该信息

如果您不需要隐藏有问题的PDF的直接URL,这样做可能会容易得多,并提供更好的性能:

  • 删除download()和Link()函数
  • 在菜单的.ss模板中执行:

  • 很抱歉等待,但我确实尝试过,它似乎起作用了。谢谢