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

API POST 请求在邮递员和 Laravel 上返回 404 NOT FOUND PAGE

Laravel 5:404 路线上的会话

Laravel Ajax 路由问题(404 响应)

Laravel 8 自定义路由在使用资源时返回 404