在写博客时需要上传修改头像和上传文件时,需要用到上传,用一套方法来控制图片和文件的上传
php artisan make:exception UploadException//1.创建类
namespace App\Exceptions;//2.书写异常方法,规定用render方法
public function render(){
//response也是一个规定用的方法
return response ()->json ( [ 'code' => 403 , 'message' => $this->getMessage () ] , 200 );
}
3.调用在第五步里的文件上传大小类型处理中
在app下手动创建server目录,在server目录里创建一个UploadServer这个类,然后创建方法:upload方法,但下面的上传需要借助第三方上传的组件,需要安装组件
composer require houdunwang/laravel-upload//安装第三方组件
php artisan vendor:publish//生成配置文件
namespace App\Providers;
//注册事件
protected $subscribe = [
UploadSubscriber::class
];
namespace App\Server;
public function upload($file,$type){
//在上传之前调用
$this->check($file,$type);
$event = new UploadEvent($file);
event($event);
##上传成功的文件y
return $event->getFile();
}
//check这个方法是要拦截步合法的文件大小和类型,要在上传之前做好拦截
public function check($file,$type){
//getSize这个方法是laravel自带的方法,获得文件的大小
$size=$file->getSize();
// hd_config是在help中定义的函数,可以读取配置项的值
if($size>hd_config('upload.'.$type.'_size')){
//这是个抛出异常的类,在下面的第步介绍
throw new UploadException('文件体积过大');
}
//getClientOriginalExtension这个是laravel自带的方法,获得文件的后缀
$ext=strtolower($file->getClientOriginalExtension());
if(!in_array($ext,explode(',',hd_config('upload.'.$type.'_type')))){
throw new UploadException('文件上传不合法');
}
}
创建模型并生成迁移文件:
php artisan make:model -m Model/Attachment
在模型里标注可允许向数据库填充的数据
<!--$guarded表示不允许写入数据库的字段,$fillable是表示可以写入数据库的字段-->
protected $guarded=[];
<!--protected $fillable = ['filename','path'];-->
在迁移文件里添加字段:
$table->string ('path')->comment('上传文件路径');
$table->string ('user_id')->comment('谁上传的');
创建表:
artisan migrate
创建模型关联:
namespace App;//User.php
public function attachment ()
{
return $this->hasMany ( Attachment::class );
}
在工具类里创建一个UploadController这个类,构建一个upload方法来完成上传任务
namespace App\Http\Controllers\Util;
//首先我们要完成上传必须注入Request,UploadServer ,Attachment 这三个类来帮助,Request 来帮助获取提交的数据,UploadServer 负责文件上传,Attachment 负责写入数据库
public function upload(Request $request, UploadServer $uploadServer ,Attachment $attachment){
//获取文件信息
$file=$request->file('file');
//如果文件存在则执行上传
if($file){
//isImage是我们在下面定义的一个方法,来判断它是否是图片上传,在这里如果是图片则$type就是image,就会读取图片上传的配置项,如果不是图片则$type就是文件,在上传中会读取文件的配置项
$path= $uploadServer->upload($file,$this->isImage($file)?'image':'file');
}
//存储到数据表
auth()->user()->attachment()->create(['path'=>url($path)]);
return ['file'=>url($path),'code'=>0];
}
//此方法用来判断是否是文件是不是图片
public function isImage($file){
//getClientOriginalExtension获取文件后缀
$ext= strtolower($file->getClientOriginalExtension());
//判断这个文件的类型是否在图片的一些基本格式之内
return in_array($ext,['jpg','png','gif']);
}