Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 下载URL的自定义路由更改_Php_Symfony_Routing_Symfony 3.4 - Fatal编程技术网

Php 下载URL的自定义路由更改

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')->

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

我的真实路径是

“/var/www/html/var/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格式不正确。

您不应将上载内容保存在
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