Laravel 在图像上返回 404
Posted
技术标签:
【中文标题】Laravel 在图像上返回 404【英文标题】:Laravel returning a 404 on an image 【发布时间】:2015-03-19 02:32:37 【问题描述】:这应该是相当简单的,虽然它完全难倒我。
我在 localhost:8000 上运行了一个后端 Laravel 安装
我有一个在 localhost:9001 上运行的前端 Angular 应用程序。
我的种子数据中包含了一些“静态”图像(例如。 '1', 'user.png'),这些图像在我的前端完美呈现(它们也从我的图像上传的确切位置提供)。
我目前提供图片的 URL 是 http://localhost:8000/images/filename
我可以将图像从前端上传到后端,它们出现在数据库中,并且图像被放入文件系统中,我在前端填充了正确的 URL(如上一个 URL 所示)。
我上传的图片没有显示。
在我的日志中我得到:
[2015-01-20 18:13:49] local.ERROR: NotFoundHttpException Route: http://localhost:8000/images/j249ae747ce28c317e02f1fb6d0a10c3.jpg [] []
[2015-01-20 18:13:49] local.ERROR: exception 'Symfony\Component\HttpKernel\Exception\NotFoundHttpException'
我在我的路由文件中尝试了一个方法,但是当我已经在提供一些图像时,我不明白为什么?
我还将 /images 文件夹的所有权限设置为 755。
有什么想法吗?
【问题讨论】:
【参考方案1】:我不确定我是否遵循您正在进行的所有多系统交互,但我会回到最初的 HTTP 原则。
尝试直接访问图片网址。
http://localhost:8000/images/j249ae747ce28c317e02f1fb6d0a10c3.jpg
如果您的浏览器(或您的日志,如果您没有将debug
设置为true
进行开发)中的错误是
local.ERROR: NotFoundHttpException 路由:http://localhost:8000/images/j249ae747ce28c317e02f1fb6d0a10c3.jpg
这意味着您的 Web 服务器在 images/j249ae747ce28c317e02f1fb6d0a10c3.jpg
找不到文件,并将请求交给 Laravel。这意味着您需要弄清楚为什么您的网络服务器看不到该文件。
假设您从 public
文件夹中提供 index.php
您有public/images/j249ae747ce28c317e02f1fb6d0a10c3.jpg
文件吗?
您确定吗?将路径复制并粘贴到终端和ls public/images/j249ae747ce28c317e02f1fb6d0a10c3.jpg
,以确保您的大脑没有遗漏一些微妙的案例问题
您的网络服务器(不是 Laravel 的)日志中是否显示任何错误
你能在 images 文件夹中创建一个 text/html 文件并提供它吗?如果不是,那么您可能没有将您的 Web 服务器指向您认为的文件夹。
有点像
http://localhost:8000/images/test.txt
http://localhost:8000/images/test.html
像这样的一些首要调试原则应该会为您指明正确的方向。
【讨论】:
是的,我尝试的第一件事是在浏览器中粘贴直接链接,它可以找到我自己放在那里的那些,但找不到 laravel 放的那些,导致我想“权限”。值得注意的是,我将这些图像存储在我的公共文件夹之外。当我粘贴到绝对路径时,例如。 localhost/images/image.png 它向我显示占位符图像图标,而不是空白页。只是一个空白图像。我应该注意,粘贴 url 会为我自己放入文件夹中的图像呈现图像,而且图像确实存在 我将其标记为正确,因为我是一个假人,因为图像试图从我的公共文件夹中提供,其中已经有两个图像,我更改了上传路径公开,它奏效了。 @fr0s1yjack 如果这让你成为一个傻瓜,那么世界上每个 Web 开发人员和程序员都是一个傻瓜:)【参考方案2】:问题是你没有为你上传的图片生成一个url
尝试像这样访问您的网址
http://localhost:8000/storage/images/j249ae747ce28c317e02f1fb6d0a10c3.jpg
生成上面的url
在您的控制器中添加此方法\Storage::disk('public')->url();
方法。此方法访问Config\filesystems.php
中的public
磁盘阵列并生成以下格式的url
http://localhost:8000/storage/images/j249ae747ce28c317e02f1fb6d0a10c3.jpg
例如下面的方法将图片保存在图片文件夹中,并生成图片路径的url。
public function uploadImage(Request $request)
$request->validate(['image'=>'file|image|max:5000']);
$imageProfile = new ImageProfile();
if($request->hasFile('image') && $request->file('image')->isValid())
$image = $request->file('image')->store('images');
$imageProfile->image_profile_url = \Storage::disk('public')->url($image);
$imageProfile->save()
return response()->json($imageProfile,200);
代码在下面返回一个 Json 响应
"id": 13,
"image_profile_url ": "http://127.0.0.1:8000/storage/images/cxlogqdI8aodERsmw74nmEx7BkxkWrnyJLMH7sFj.jpeg",
"updated_at": "2020-01-13 16:27:37",
"created_at": "2020-01-13 16:27:37",
尝试复制url并在postman中测试。
访问链接以了解有关 Laravel 文件存储的更多信息 Laravel File Storage
希望对你有帮助。
【讨论】:
【参考方案3】:laravel 8
控制器功能
public function store(Request $request)
$this->validate($request, [
'site_title' => 'required',
'logo_image' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
]);
$input['logo_image'] = time().'.'.$request->logo_image->getClientOriginalExtension();
$request->logo_image->move(public_path('images'), $input['logo_image']);
$input['site_title'] = $request->site_title;
//dd($input);
Site_settings::create($input);
return back()->with('success','Image Uploaded successfully.');
刀片视图
<td>
<img src=" url('/images/').'/'.$site_settings->logo_image ?? '' " >
</td>
【讨论】:
【参考方案4】:rm public/storage
php artisan optimize:clear
php artisan storage:link
这对我有用。
【讨论】:
以上是关于Laravel 在图像上返回 404的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 路由上的 PHPunit 测试总是返回 404
Laravel 除了“/”之外的所有路由在 AWS EC2 上返回 404