下载的自定义路径更改 URL

Custom route change for download URL

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

我的真实路径是

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

最后我需要它是:

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

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

可以帮忙编辑我的代码吗:

    $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 格式不正确。

与其将上传的内容保存在 public/ 文件夹中,不如将它们保存在网络服务器的 public 文档根目录之外的某个位置,因为这是一个潜在的安全风险,即有人可能会他们没有经过机制。例如,您可以在 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.html and https://symfony.com/doc/current/components/http_foundation.html#serving-files

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

现在,无需创建伪 links,您可以在您的应用程序中直接调用,例如在您的模板中:

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

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

回顾一下,假设您的项目在 /var/www/myproject 中,Web 服务器的 public 目录是 /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 而无需移动单个文件。