Php 下载URL的自定义路由更改
我正在尝试更改下载文件路径,以便通过添加一个不存在的文件夹“/protected/”来保护它 我的真实路径是 “/var/www/html/var/uploads/Statements/2019-06/export-1.csv” 最后,我需要的是: “” 我尝试了各种版本,但我的代码没有返回想要的路径 您能帮我编辑代码吗Php 下载URL的自定义路由更改,php,symfony,routing,symfony-3.4,Php,Symfony,Routing,Symfony 3.4,我正在尝试更改下载文件路径,以便通过添加一个不存在的文件夹“/protected/”来保护它 我的真实路径是 “/var/www/html/var/uploads/Statements/2019-06/export-1.csv” 最后,我需要的是: “” 我尝试了各种版本,但我的代码没有返回想要的路径 您能帮我编辑代码吗 $file = realpath($file); $projectDir = $this->container->get('kernel')->
$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/
文件夹中,而应将其保存在web服务器的公共文档根目录之外的某个位置,因为这是一种潜在的安全风险,即有人可能不通过该机制获取它们。例如,您可以在public/
旁边有一个名为data/uploads
的目录。这将确保web服务器无法访问文件
在Symfony项目中,您可以创建一个DownloadController,该控制器将路径或文件名作为参数,然后将其附加到文件夹:
class DownloadController扩展了AbstractController
{
//这应该是存储文件的路径
私有$uploadDir;
公共函数构造(字符串$uploadDir)
{
$this->uploadDir=$uploadDir;
}
/**
*@Route(“/protected/uploads/{file}”,name=“download”,requirements={“file”=“+”})
*/
公共函数索引(字符串$file)
{
返回新的BinaryFileResponse($this->uploadDir.$file);
}
}
见:和
您可能需要进行一些清理和健全性检查,例如,当文件丢失或有人想欺骗您下载基本目录以外的内容时,但大致上应该是这样
现在,您可以在应用程序中调用(例如,在模板中),而不是创建伪链接:
{{ 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,而无需移动单个文件。使用控制器并指定所需的路由,然后将代码粘贴到控制器中,并返回文件而不是URL