Laravel 5.4存储文件未找到。

13

我正在使用 Laravel 5.4。我将一些文档文件上传到 storage/app/public/documents 文件夹中,比如

$request->paper_file->store('documents');

我的文件上传成功了。

在文件系统中,默认存储为公共,公共配置如下:

'public' => [
'driver' => 'local',
'root' => storage_path('app/public'),
'url' => env('APP_URL').'/storage',
'visibility' => 'public',],

但是当我访问 /storage/documents/hQqlgifnVVH8bmrRPVdZ9aFGbhLmcc7g7bHZSX4u.pdf 时,显示404未找到。该如何解决此问题。


你在文件系统中看到这个文件吗?文档中展示了像 $request->file('paper')->store('documents') 这样的用法,但我不确定你的 paper_file 是什么。 - ceejayoz
我的文件上传成功了。文件名是paper_file。 - Iftakharul Alam
那么,hQqlgifnVVH8bmrRPVdZ9aFGbhLmcc7g7bHZSX4u 是从哪里来的呢? - ceejayoz
这是 Laravel 生成的动态文件名。https://laracasts.com/series/whats-new-in-laravel-5-3/episodes/12 - Iftakharul Alam
请您添加处理上传过程的方法。 - Amr Aly
6个回答

45

默认情况下,Laravel将文件放置在storage/app/public目录中,该目录无法从外部网络访问。因此,您需要在该目录和您的公共目录之间创建符号链接:

storage/app/public -> public/storage

您可以通过执行php artisan storage:link命令 (文档) 来完成这个过程。


3
执行此命令时,我遇到了一个错误,类似于“'public/storage'目录已经存在”。在重新执行命令之前,我只是删除了公共文件夹中的空存储文件夹。 - Arthur Lekane
注意:如果 Web 根目录指向项目文件夹 /public(推荐),则所有资源和存储文件都可以直接访问您的域名根目录,分别为 domain.com/js/jquery.jsdomain.com/storage/avatar.jpg - Abdul Rehman

5
当你使用Laravel的存储函数上传图像时,它会被存储在一个存储文件夹中。例如:storage/app/public/avatars/file1.png
但是当你想通过URL访问它时,应该像这样访问它:storage/avatars/file1.png
这对我来说起作用了,使用的是Laravel 7.x版本。

为什么这个工作,尤其在生产中起作用? - Fifth Horseman

5
在将项目移动到不同文件夹后,我遇到了这个问题。 如果您已经生成存储链接,请尝试删除public/storage文件夹并重新运行:
php artisan storage:link

2
删除 public/storage 是关键。 - Michal Orlík

4

在 Laravel ^5.8 版本中:

  • 确保您运行命令 php artisan storage:link,将 storage/app/publicpublic/storage 进行链接。

现在:

// this return some like 'public/documents/file.ext'
$path = $request->paper_file->store('public/documents');

// this return some like 'storage/documents/file.ext'
$publicPath = \Storage::url( $path) );

// this return some like '< APP_URL env variable >/storage/documents/file.ext'
$url = asset( $publicPath );


1
如果你来自于laravel 8.x并且确实运行了php artisan storage:link命令(创建符号链接),但是你的代码不起作用,即你尝试加载的文件没有显示,那么你和我一样。
正如awais ahmad所提到的,这个解决方案对我的laravel 8x项目很有帮助。我没有在我的blade文件中使用asset帮助函数添加"storage"路径名称,因此我的图像路径没有输出任何内容,但当我输入了'storage'路径名称,就像这样asset('storage/uploads/pic1.png) ,我的代码就可以工作了!
希望这能帮助到某些人。

0
运行php artisan storage:link后,它会在公共文件夹中创建一个符号链接,您可以像这样检索记录:<img src='{{ asset("public/$advert6") }}' class="img-responsive">。您应该包括public目录。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接