【问题标题】:Custom route change for download URL下载 URL 的自定义路由更改
【发布时间】:2019-10-24 20:38:12
【问题描述】:

我正在尝试更改我的下载文件路径,以便通过添加一个不存在的文件夹“/protected/”来保持它受到保护

我的真实路径是

"/var/www/html/var/uploads/Statements/2019-06/export-1.csv"

最后我需要它:

http://app.local:8080/protected/uploads/Statements/2019-06/export-1.csv

我尝试了各种版本,但我的代码没有返回想要的路径。

能否帮助我编辑我的代码:

    $file = realpath($file);
    $projectDir = $this->container->get('kernel')->getProjectDir();
    $webDir = realpath($projectDir);
    $finalPath = substr($file, strlen($webDir));

    $request = $this->container->get('request_stack')->getCurrentRequest();

    $downloadUrl = $request->getScheme() . '://' . $request->getHttpHost() . $request->getBasePath() . '/' . $finalPath;

    return $downloadUrl;

$downloadUrl 可以正常工作,但 $finalPath 格式不正确。

【问题讨论】:

  • 使用控制器并指定您需要的路由,然后将代码粘贴到控制器中并返回文件而不是 URL

标签: php symfony routing symfony-3.4


【解决方案1】:

您不应将上传的内容保存在public/ 文件夹中,而应将它们保存在 Web 服务器的公共文档根目录之外的某个位置,因为这是一个潜在的安全风险,即有人可能会在不通过该机制的情况下获取它们。例如,您可以在public/ 旁边有一个名为data/uploads 的目录。这将确保 Web 服务器无法访问文件。

在您的 Symfony 项目中,您可以创建一个以路径或文件名作为参数的 DownloadController,然后将其附加到文件夹中:

class DownloadController extends AbstractController
{
    // This should be the path you store your files in
    private $uploadDir;

    public function __construct(string $uploadDir)
    {
        $this->uploadDir = $uploadDir;
    }

    /**
     * @Route("/protected/uploads/{file}", name="download", requirements={"file"=".+"})
     */
    public function index(string $file)
    {
        return new BinaryFileResponse($this->uploadDir . $file);
    }
}

请参阅:https://symfony.com/doc/current/routing/slash_in_parameter.htmlhttps://symfony.com/doc/current/components/http_foundation.html#serving-files

您可能需要进行一些清理和健全性检查,例如当文件丢失或有人想欺骗您下载基本目录之外的内容时,但大致应该是这样。

现在,您可以在应用程序中调用,而不是创建伪链接,例如在您的模板中:

{{ path('download', { 'file': 'Statements/2019-06/export-1.csv' }) }}

这将在您的应用程序中创建一个正确的下载链接。您还可以从虚拟文件名创建映射,例如该控制器操作中实际文件名的哈希值。您只需要以某种方式跟踪引用。您还可以添加访问检查,或下载该操作的计数器。

回顾一下,假设您的项目在/var/www/myproject,Web 服务器的公共目录是/var/www/myproject/public/,而您的文件保存在/var/www/myproject/data/uploads/。然后上传的文件位于/var/www/myproject/data/uploads/Statements/2019-06/export-1.csv 中,URL 将如下所示:http://app.local:8080/protected/uploads/Statements/2019-06/export-1.csv。通过更改路由注释的路径,您可以简单地调整 URL,而无需移动单个文件。

【讨论】:

    猜你喜欢
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2019-03-28
    • 1970-01-01
    • 2020-02-03
    • 1970-01-01
    相关资源
    最近更新 更多