0

我正在使用 tcpdf 生成 pdf 报告。我已将该报告文件存储在 Web 根目录下。然后我通过重定向到该页面来显示pdf

代码:全选 http://sitename/pdf/student_record.pdf

我不想透露目录名 pdf 和文件名。由于某些安全原因,我想为此设置一些重复的名称。如何使用 routing.yml 做到这一点?

谢谢你。

4

3 回答 3

3

我必须做你想做的事情。所以,我用 myActions 扩展了 sfActions 并添加了方法:

/**
 *
 * @param string $path
 * @param string $mimetype
 * @return sfView::NONE
 */
public function downloadFile($path, $mimetype, sfRequest $request) {
    if (is_file($path) && is_readable($path)) {
        $this->setLayout(false);
        sfConfig::set('sf_web_debug', false);
        $this->getResponse()->clearHttpHeaders();
        $this->getResponse()->setHttpHeader('Content-Disposition', 'attachment; filename="' . basename($path) . '"');
        $this->getResponse()->setHttpHeader('Content-type', $mimetype);
        $this->getResponse()->setHttpHeader('Pragma: public', true);
        $this->getResponse()->setHttpHeader('Expires', 0);
        $this->getResponse()->setHttpHeader('Content-Transfer-Encoding', 'binary');
        $this->getResponse()->setHttpHeader('Content-Length', filesize($path));
        $this->getResponse()->sendHttpHeaders();
        file_put_contents(sfConfig::get('sf_upload_dir').'/test.txt', var_export($_SERVER, 1) . 'TEST');
        if($request->isMethod(sfRequest::HEAD))
            $this->getResponse()->setContent('');
        else
            $this->getResponse()->setContent(file_get_contents($path));
    }
    else
        $this->forward404('Unreadable file', 'json');

    return sfView::NONE;
}

并将该方法用于路由操作。例如,我们有模型 Author 和 mp3。因此,在 routing.yml 中:

author_show:
  url:       /api/authors/:id.:sf_format
  class:     sfDoctrineRoute
  options:   { model: Author, type: object }
  param:     { module: author, action show }
  requirements:
    sf_format: (?:mp3)

在行动:

switch($request->getParameter('sf_format')) {
        case 'mp3':
            $path = sfConfig::get('sf_upload_dir') . '/authors/audio/' . $author->getAboutAudio();
            $mimetype = 'audio/mpeg';
            break;

        default:
            $this->forward500('Unknown format. Only mp3 format is available.', 'json');
    }
    return $this->downloadFile($path, $mimetype, $request);

此外,您可以将其存储在上传文件的某个子文件夹中,并使用 .htaccess 对其进行保护,例如

deny from all
于 2011-04-08T08:47:04.780 回答
0

你不应该使用 symfony 来上传文件,而你的 web 服务器可以直接上传。例如,将文件保存在外部目录中,例如 /path/to/pdf,然后在您的虚拟主机中添加:

Alias /pdf /path/to/pdf

如果您还想更改名称,可以使用某种重写规则。

于 2011-04-08T09:33:36.830 回答
0

将 pdf 保存在 webroot 之外,然后创建一个路由和操作来检查用户是否可以访问它,然后为 pdf 文件设置正确的标题并通过fpassthru()or输出它readfile()

于 2011-04-08T08:45:36.887 回答