当前位置: 首页 > 工具软件 > HDJS > 使用案例 >

hdjs-图片 文件上传

叶文博
2023-12-01

在写博客时需要上传修改头像和上传文件时,需要用到上传,用一套方法来控制图片和文件的上传

**第一步:构建上传页面:** ```
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.调用在第五步里的文件上传大小类型处理中
**第五步:创建一个服务类UploadServer,来实现文件上传,只是处理上传,上传到服务器上,如果你用的是本地服务器就是上传到本地服务器的,如果是阿里云服务器,就会上传到阿里的服务器**
在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('文件上传不合法');
       }

}

**第六步:创建一个Attachment模型来创建一个attachment的表格,来存储上传到服务器的图片信息**

创建模型并生成迁移文件:

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 );
}
**第七步:上传图片我们把它构建在util中,属于一个小的上传工具**

在工具类里创建一个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']);
    }
**图片列表的显示** ``` public function lists () { $data = Attachment::paginate(1); $attachment = $data->toArray(); foreach($attachment['data'] as $k=>$v){ $attachment['data'][$k]['url'] = $v['path']; } return ['code'=>0,'data'=>$attachment['data'],'page'=>$data->links() . '']; } ```
 类似资料: