Laravel 文件存储,上传了图片,无法显示图片,报错 404

已经按照官方文档的说明,执行

php artisan storage:link

简历软连接。

起初以为是建立失败。下载了windows官方的工具 Jucntion 进行检测,确认软连接建立成功。

尝试了多次上传图片,public\storage 文件夹一直为空。storage/app\img下出现上传的文件。

已经尝试过echo asset() ,无法访问 404.

谢谢各位给解答一下。

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

上传图片的位置是错的。应该是 D:\laragon\www\bbs\storage\app\public\avatars\test.jpg;
建立软连接后,访问地址 http://test.com/storage/avatars/test.jpg;
不明白可以看下这个软连接;问答:storage:link 创建的软连接是固定的吗?

5年前 评论
讨论数量: 14

建立软连接后,访问 /storage/imgs/test.jpg,相当于访问 /storage/app/public/imgs/test.jpg;是不是你的路径不对

5年前 评论

谢谢你的回复!

我用 Laragon 搭建的环境, 将更目录设置为: D:\laragon\www\bbs\public 无法直接访问\storage。 图片上传部分的代码如下:

public function update( Request $request,User $user)
    {

        $date=$request->all();
        $path = $request->file('avatar')->store('avatars');
        $date['avatar'] = asset($path);

        $user->update($date);
        return redirect()->route('users.show', $user->id)->with('success', '个人资料更新成功!');
    }

图片上传后会出现在 D:\laragon\www\bbs\storage\app\avatars目录下,文件名为随机的字符串。

建立软连接后,在D:\laragon\www\bbs\public目录下会出现一个storage文件夹, 图片上传后, 这个文件夹为空。
按照官方文档对File Storage的说明, 我的理解为,图片回保存到D:\laragon\www\bbs\storage\app\avatars目录下,访问路径应该是 http://localhost/storage/avatars/c4VI09iSv7YOWAOwIUnNebEvJwqVrRdp8Jhmjlbj.jpg.

尝试访问以上路径 报错404

访问 http://localhost/storage/app/avatars/c4VI09iSv7YOWAOwIUnNebEvJwqVrRdp8Jhmjlbj.jpg.
也是报错404

补充:dd($date['avatar'] = asset($path))的结果为:
http://localhost/avatars/c4VI09iSv7YOWAOwIUnNebEvJwqVrRdp8Jhmjlbj.jpg

5年前 评论

上传图片的位置是错的。应该是 D:\laragon\www\bbs\storage\app\public\avatars\test.jpg;
建立软连接后,访问地址 http://test.com/storage/avatars/test.jpg;
不明白可以看下这个软连接;问答:storage:link 创建的软连接是固定的吗?

5年前 评论

看不见是因为没有同步的问题,当创建软连接后,访问的地址就应该是public目录的地址,使用phpstorm编辑器的话,在public/storage文件夹点右键,选择Synchronize 'storage'即可看到,所有访问都应该通过public\storage而不是根目录的storage文件夹.

5年前 评论

谢谢 !@kangfq 用vs code,有没有类似的功能可以sync以下?

5年前 评论

@littlebear0871 没有用过vs code .其实同不同步只是显示问题而已,你依然可以直接通过链接正常的访问,不要在意目录里面是否存在文件.

5年前 评论

@风吹过有夏天的味道 将代码改为以下这样

file

按照你活的可以访问了。但是 asset() 返回的url是:http://localhost/public/avatars/5aFMD7HTEMNwHf7iix2Zikus1puxVfF0kSotx2BP.jpeg

filesysem 配置如下(一个字都没改过):

file

5年前 评论

@littlebear0871
file

文件存储《Laravel 5.8 中文文档》

在文档中有讲到获取文件驱动内url的方法.

5年前 评论

谢谢,一直纠结于 asset()方法。。。。。2了。。。。

5年前 评论

@littlebear0871 不用客气,共同进步.

5年前 评论

这个生成的是不对的它不会给你建立对应的地址,url路径差异需要自己对应起来
图片上传地址:D:\laragon\www\bbs\storage\app\public\avatars\test.jpg
链接帮你做一件事相当于在public目录下生成了一个storage目录,访问/storage/,相当于访问D:\laragon\www\bbs\storage\app\public\
外部访问url无论哪种方式符合上面对应方式都行

5年前 评论

@风吹过有夏天的味道 非常感谢! 纠结于asset()。。没注意到后面的文档。。。现在明白了,用个字符串改一下url,只要对应起来就ok。 再次感谢。最佳答案!!!:)

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!