下载的自定义路径更改 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 而无需移动单个文件。
我正在尝试更改我的下载文件路径,以便它可以通过添加一个不存在的文件夹“/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 而无需移动单个文件。