发现

这是我在做头像上传功能时发现的,下面是图片上传的业务逻辑。

class AvatarController extends Controller
{
public function update(Request $request)
{
$this->validate($request, [
'avatar' => 'required|image|dimensions:max_width=400,max_height=400',
], [
'avatar.required' => '请先选择上传的头像。',
'avatar.dimensions' => '上传头像的宽高都不能大于 400 像素。',
]); $avatar = $request->file('avatar'); if ($avatar->isValid()) {
$user = Auth::user(); $path = Storage::putFile('public/uploads/avatars', $avatar);
$user->avatar = Storage::url($path);
$user->save();
} return back();
}
}

$avatar 是从页面接收过来的头像图片。你可能从未想过,短短三行代码就实现了图片上传:

$path = Storage::putFile('public/uploads/avatars', $avatar);
$user->avatar = Storage::url($path);
$user->save();

保存图片

如果没有使用 disk 方法指定「硬盘」,Storage 门面默认使用的硬盘就是 local,对应存储路径是 storage/app。所以

$path = Storage::putFile('public/uploads/avatars', $avatar);

产生的上传路径($path)的值类似:public/uploads/avatars/iT8Lg6mmF8qtlskbl54tlsNlYmJLLZnAZzkZsFJH.png,图片实际存储的位置在 /path/to/myapp/storage/app/public/uploads/avatars/iT8Lg6mmF8qtlskbl54tlsNlYmJLLZnAZzkZsFJH.png

生成图片 URL

黑科技来了。你知道 Storage::url($path) 会产生什么结果吗?答案揭晓——/storage/uploads/avatars/iT8Lg6mmF8qtlskbl54tlsNlYmJLLZnAZzkZsFJH.png

Oops!$path 的 「public」被去掉,然后在头部加了 /storage。这就是 Laravel 的 careful。

访问图片

<img src="{{ asset(Auth::user()->avatar) }}" alt="用户头像">

奇妙的 Storage::url的更多相关文章

  1. laravel之Storage

    学习laravel一段时间了,从最开始文件保存到本地直到oss都使用原生或接口.今天偶尔看到了Storage.正好项目中有用到就在项目上使用了. 1.下载安装库 composer require ja ...

  2. Facebook网络模拟测试工具ATC使用

    Facebook在其工程博客(原文)上宣布开源移动网络测试工具Augmented Traffic Control(ATC),我迅速试用了一番,非常不错,对手游或者其他APP的调试和测试都非常有帮助,介 ...

  3. OpenStack Swift集群部署流程与简单使用

    之前介绍了<OpenStack Swift All In One安装部署流程与简单使用>,那么接下来就说一说Swift集群部署吧. 1. 简介 本文档详细描述了使用两台PC部署一个小型Sw ...

  4. Django Model field reference

    ===================== Model field reference ===================== .. module:: django.db.models.field ...

  5. flask 未完待续

    Flask - 一个短小精悍.可扩展的一个Web框架很多可用的第三方组件:http://flask.pocoo.org/extensions/blogs:https://www.cnblogs.com ...

  6. Django文件存储(二)定制存储系统

    要自己写一个存储系统,可以依照以下步骤: 1.写一个继承自django.core.files.storage.Storage的子类. from django.core.files.storage im ...

  7. CentOS7 安装kylin2.6.0集群

    1. 环境准备 zookeeper3.4.12 mysql5.7 hive2.3.4 hadoop2.7.3 JDK1.8 hbase1.3.3 2. 集群规划 ip地址 机器名 角色 192.168 ...

  8. [js]BOM篇

    一.什么是BOM BOM(Browser Object Model)即浏览器对象模型. BOM提供了独立于内容 而与浏览器窗口进行交互的对象: 由于BOM主要用于管理窗口与窗口之间的通讯,因此其核心对 ...

  9. [Windows Azure] Configuring and Deploying the Windows Azure Email Service application - 2 of 5

    Configuring and Deploying the Windows Azure Email Service application - 2 of 5 This is the second tu ...

随机推荐

  1. jQuery ajax submit form 被拦截问题的解决

    一般情况下用js或jquery的submit方法提交form表单是不会被浏览器拦截的,但是发现异步的情况下用js提交form表单就会被浏览器拦截,这样就对功能的实现带来了很多的麻烦.网上看了好多都是同 ...

  2. INSTALL_FAILED_SHARED_USER_INCOMPATIBLE的问题

    eclipse编译出来的apk,安装时报出INSTALL_FAILED_SHARED_USER_INCOMPATIBLE的错误. 原因:apk的AndroidManifest.xml中声明了andro ...

  3. Java-Maven-Runoob:Maven NetBeans

    ylbtech-Java-Maven-Runoob:Maven NetBeans 1.返回顶部 1. Maven NetBeans NetBeans 6.7 及更新的版本已经内置了 Maven.对于以 ...

  4. Apache+PHP多端口多站点

    # # Listen: Allows you to bind Apache to specific IP addresses and/or # ports, instead of the defaul ...

  5. mybatis generator 用法

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration ...

  6. c# 各种tips

    1.lock 类似于 java中的synchronized,对对象或代码块加上互斥锁. 2.c#中的lambda表达式, ForEach(x => f(n)) 3.c# 中的 something ...

  7. 列举不少于6条的IE与FF脚本兼容性问题,需要写出命令

    (1) window.event: 表示当前的事件对象,IE有这个对象,FF没有,FF通过给事件处理函数传递事件对象 (2) 获取事件源 IE用srcElement获取事件源,而FF用target获取 ...

  8. Metasploit自动化脚本Ezsploit

    打开文件夹并赋予权限 ┌─[root@sch01ar]─[~] └──╼ #cd /sch01ar/ezsploit/ && ls ezsploit.sh README.md ┌─[r ...

  9. 微信小程序之本地缓存

    目前,微信给每个小程序提供了10M的本地缓存空间(哎哟妈呀好大) 有了本地缓存,你的小程序可以做到: 离线应用(已测试在无网络的情况下,可以操作缓存数据) 流畅的用户体验 减少网络请求,节省服务器资源 ...

  10. Activex感知网页刷新关闭事件

    原因 大多数ActiveX控件框架,例如MFC和ATL,在本地激活ActiveX控件时创建控件.基于性能上的考虑,直到控件第一次可见的时候,IE才本地激活ActiveX控件.这样包含ActiveX控件 ...