Laravel 5.4存储:下载文件。文件不存在,但显然存在

Laravel 5.4存储:下载文件。文件不存在,但显然存在,laravel,Laravel,我一直在反复讨论这个问题。我上传了以下内容: public function store(Tool $tool) { If(Input::hasFile('file')){ $file = Input::file('file'); $name = $file->getClientOriginalName(); $path=Storage::put('public',$file); //Storage::disk('

我一直在反复讨论这个问题。我上传了以下内容:

public function store(Tool $tool)
{

     If(Input::hasFile('file')){
        $file = Input::file('file');
        $name = $file->getClientOriginalName();
        $path=Storage::put('public',$file);         //Storage::disk('local')->put($name,$file,'public');

        $file = new File;
        $file->tool_id = $tool->id;
        $file->file_name = $name;
        $file->path_to_file = $path;
        $file->name_on_disk = basename($path);
        $file->user_name = \Auth::user()->name;
        $file->save();

        return back();
    }
但是,当我尝试下载时:

public function show($filename)
    {   

        $url = Storage::disk('public')->url($filename);

        ///$file = Storage::disk('public')->get($filename);
        return response()->download($url);
    }
我从laravel获得FileNotFound异常 但是,如果我使用此选项:

$file = Storage::disk('public')->get($filename);
return response()->download($file);
我明白了

FileNotFoundException在File.php第37行:文件“use calib

插入 注释(
工具id
用户id
注释
创建,
更新) 值(1,1,'windows server 2008糟糕透了',now(),now());“不存在

这是文件的实际内容

它显然可以找到文件。但是为什么不下载呢

替换:

$file = Storage::disk('public')->get($filename);
return response()->download($file);
与:

response()->download()
获取文件的路径,而不是文件内容。更多信息请点击此处:

尝试以下操作:

return response()->download(storage_path("app/public/{$filename}"));

如果任何人仍然找不到他们的文件,即使文件明显存在,那么请尝试

return response()->file(storage_path('/app/' . $filename, $headers));

这可能是由于缺少目录分隔符,或者它没有存储在公用文件夹中。

我以前尝试过这样做。正是那件事。它告诉我该文件不存在。谢谢。是的,我知道这是一条路。我给了它一条路,但它说它没有找到。我只包含了$file的一部分,以便您可以看到它返回了文件的内容。因此,它可以找到文件内存过载?这实际上是有效的。但是为什么呢?似乎添加存储的实际外观,并获得异常的URL会起作用吗?或者更确切地说,事实上,我也包括该死的符号链接等。很高兴它的工作。谢谢你的帮助。文档一点帮助都没有。我尝试了各种方法,甚至还查看了Facade等的底层类的源代码,包括存储路径,但也包括到存储路径的路径-在某种程度上。从laravel文档:
url函数生成到给定路径的完全限定url
,但是在
response()->download()
方法中,您需要文件路径,而不是完全限定的url。但是,如果您使用的是不同的存储磁盘,则这不起作用。你知道如何使用存储门面来处理它吗?我们在生产和本地开发中使用Azure,因此需要有一种方法使其同时适用于这两种情况。这只是因为您创建了一个符号链接,但如果您使用storage facade是因为您不希望通过URL获得私人文件,则这不适用于laravel 5.5及以下版本。@Naral storage facade不会使文件成为私有文件。这取决于你使用的驱动程序<代码>存储::磁盘('public')尽管使用了存储外观,但仍然引用公共文件。你需要做一个象征性的链接,即使是门面也能正常工作。这个答案不适用于私人文件-请参考OP的问题。这也是我在存储路径中缺少“app”的原因。拉维尔7号
return response()->file(storage_path('/app/' . $filename, $headers));