【发布时间】:2017-10-07 07:05:50
【问题描述】:
我已经构建了一个 laravel 应用程序,其中在 public/files 目录中有一些文件。如果我将此链接提供给其他人,例如下载链接,他们就有机会知道我的目录..
假设我必须将下载链接作为
www.abc.com/files/45454553535.zip
但我不想让用户知道它在文件目录中。那么如何隐藏目录呢?
【问题讨论】:
标签: php laravel laravel-5 directory
我已经构建了一个 laravel 应用程序,其中在 public/files 目录中有一些文件。如果我将此链接提供给其他人,例如下载链接,他们就有机会知道我的目录..
假设我必须将下载链接作为
www.abc.com/files/45454553535.zip
但我不想让用户知道它在文件目录中。那么如何隐藏目录呢?
【问题讨论】:
标签: php laravel laravel-5 directory
你可以创建一个你的控制器和路由。
Route::get('files/{filename}', [
'as' => 'file.get',
'uses' => 'FileController@get',
]);
控制器应该检查您的正确目录。尽量将文件保存在存储路径中,而不是公开。
class FileController extends Controller
{
private $path;
public function __construct()
{
$path = storage_path()
. '/your-valid-directory/';
}
public function get($filename)
{
$file_path = $this->path
. filter_var($filename, FILTER_SANITIZE_STRING);
if (file_exists($file_path) && is_readable($file_path)) {
return response(file_get_contents($file_path), 200, [
'Content-Type: application/zip',
]);
} else {
abort(404);
}
}
}
现在您可以通过以下方式访问特定文件:
{{ route('file.get', ['filename' => '45454553535.zip') }}
此操作生成链接如下所示:your-domain.com/files/45454553535.zip。 :)
无论如何,我认为 - 将来只需使用特定的标题、目录制作文件工厂。
祝你好运!
【讨论】:
试试这个。
public function getDownload()
{
$filename='45454553535.zip'
$file= public_path(). "/files/".$filename;
$headers = array(
'Content-Type: application/zip',
);
return Response::download($file, $filename, $headers);
}
“.files/45454553535.zip”将不起作用,因为您必须提供完整的物理路径。
2016 年 5 月 20 日更新
Laravel 5、5.1、5.2 或 5.* 用户可以使用以下方法代替 Response 门面。但是,我之前的答案适用于 Laravel 4 或 5。
返回响应()->下载($file, $filename, $headers);
【讨论】:
我不知道这是否可行,但给你一个想法。像这样创建一个 php 文件使用:
header('Content-Type: application/zip');
$a=file_get_contents(file.zip)
echo $a;
从此用户将不知道从哪里获取内容。
【讨论】:
将您的文件保存在storage 目录中。这样您就可以通过代码将文件提供给用户。
【讨论】: