Laravel 上传图片到本地
在一个项目中上传文件是必不可少的一个基础功能。那么我们用 laravel
怎么上传图片呢?
比如我们要让用户上传自己的头像。
首先在要提交的表单里面添加上上传文件的代码:
<input type="file" name="avatar">
然后在表单属性里一定要添加 enctype="multipart/form-data"
属性才行,否则图片是提交不上去的
<form action="{{ route('users.update', $user->id) }}" method="POST" accept-charset="UTF-8" enctype="multipart/form-data">
当然在后台接受数据之前肯定要先进行验证用户上传的图片是否合法。我们需要在表单上传请求类中添加一下图片验证规则
<php use Illuminate\Foundation\Http\FormRequest; class UserRequest extends FormRequest { public function authorize() { return true; } public function rules() { return [ 'avatar' => 'mimes:jpeg,bmp,png,gif', ]; } public function messages() { return [ 'avatar.mimes' =>'头像必须是 jpeg, bmp, png, gif 格式的图片', ]; } }
图片验证规则有很多,甚至我们可以验证图片的分辨率大小:
.
.
.
'avatar' => 'mimes:jpeg,bmp,png,gif|dimensions:min_width=208,min_height=208',
.
.
.
我们用了 dimensions 来限制图片的宽和高必须要在 208px 以上
然后我们就能够通过 (请求对象)Request 来获取文件啦,通常有两种方式来获取文件:
// 第一种方法
$file = $request->file('avatar');
// 第二种方法,可读性更高
$file = $request->avatar;
既然我们拿到了上传的文件,那么接下来就是要保存到我们指定的位置啦!
我们先生成保存图片的路径
//值如:uploads/images/avatars/201709/21/
$folder_name = "uploads/images/avatars/" . date("Ym/d", time());
通常我们需要按照时间日期来进行分割文件夹,这样能使我们的查找效率更高。
那么我们的文件储存物理路径则为:
$upload_path = public_path() . '/' . $folder_name;
public_path()
获取的是 public
文件夹的物理路径。
接下来就是拼接要生成的文件名了
// 获取文件的后缀名,因图片从剪贴板里黏贴时后缀名为空,所以此处确保后缀一直存在
$extension = strtolower($file->getClientOriginalExtension()) ?: 'png';
// 拼接文件名,加前缀是为了增加辨析度,前缀可以是相关数据模型的 ID
// 值如:1_1493521050_7BVc9v9ujP.png
$filename = $file_prefix . '_' . time() . '_' . Str::random(10) . '.' . $extension;
最终再用 move
方法移动就行啦!
// 将图片移动到我们的目标存储路径中
$file->move($upload_path, $filename);
//此时文件的路径则为
'path' => config('app.url') . "/$folder_name/$filename"
不出意外,此时已经保存在了我们指定的位置,接下来将路径保存到数据库中就行了
$user->avatar = $folder_name . '/' . $filename;
$user->save();
当然想要用此方法保存那我们要先在 User
模型中将 avatar
字段添加到白名单才行。
//将 avatar 添加到 fillable 数组中就行了
protected $fillable = [
'name', 'email', 'password', 'avatar',
];
我们在保存文件路径的时候,如果该文件在本地则保存相对路径,比如 uploads/images/avatars/201709/21/ 就行了,如果文件不再本地则需要保存全路径啦。
到此我们图片上传就完成啦
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//上传图片
public function uploadImage(Request $request)
{
$file = $request->file('file');
//值例如 upload/images/avatars/202123/21
$folder_name = "upload/images/article/".date('Ym/d/',time());
$upload_path = public_path() . "/" . $folder_name;
$extension = strtolower($file->getClientOriginalExtension()) ?: 'png';
$filename = time().'.'. $extension;
//将图片移动到我们目标存储路径中
$file->move($upload_path , $filename);
return "http://yh.lartzl.com/".$folder_name.$filename;
}
---------------------------------------------------------------------------------------------------------------------------
laravel 是无法访问
storage/app/public/images 里面的图片的
首先
laravel建立storage目录文件到public的软连接
执行命令:php artisan storage:link
命令执行完毕后,就会在项目里多出一个 public/storage,
这个 storage 就是一个软链接,它指向 storage/app/public 目录。
public/storage(软连接) → storage/app/public
然后就可以用地址直接访问public里面的照片了! 必须创建软连接
//上传图片
public function uploadImage(Request $request)
{
$path = $request->file('file')->store('avatars/'.date('Y-m-d'), 'public');
return $path;
}