laravel-保存和显示多媒体

      2022年03月16日 星期三 20:50:27     laravel   工作囖      laravel   php   工作    

今天是工作的第10天;工作上感觉实在太累了,眼睛看一天电脑,手一天ctrl+v,ctrl+c;平时上下班挤公交手都当锻炼了

今天做到一个媒体文件(图片,文件,视频)存储和显示的功能,虽然简单,但是之前也少接触

有些写法可能有点幼稚

首先存文件:

    public function upload(Request $req){
        $userdata = $req->input('user_detail');

        //保存图片
        if($req->hasFile('images')){
            $file = $req->file('images');
            if($file->isValid()){ //是否上传有效
                $allowed_extensions = ["png", "jpg", "gif"];
                if ($file->getClientOriginalExtension() && !in_array($file->getClientOriginalExtension(), $allowed_extensions)) {
                    $this->error(['msg'=>'图片格式支持png,jpg,gif']);
                }
                if($file->getSize()>1048576){
                    $this->error(['msg'=>'图片大小不能大于1MB']);
                }

                $path = $file->storeAs(
                    'upload/images/postcart', $userdata['id'].'_'.time().'.'.$file->getClientOriginalExtension()
                );
                $this->success(['data'=>Storage::url($path)]);
            }else{
                $this->success(['msg'=>'上传失败']);
            }
        }

        //保存视频
        if($req->hasFile('videos')){
            $file = $req->file('videos');
            $allowed_extensions = ["mp4","3gp"];
            if ($file->getClientOriginalExtension() && !in_array($file->getClientOriginalExtension(), $allowed_extensions)) {
                $this->error(['msg'=>'视频格式支持MP4,3gp']);
            }
            // if($file->getSize()>1048576){
            //     $this->error(['msg'=>'视频时长不能大于1分钟']);
            // }

            $path = $file->storeAs(
                'upload/video/postcart', $userdata['id'].'_'.time().'.'.$file->getClientOriginalExtension()
            );

            $this->success(['data'=>Storage::url($path)]);
        }

        //保存录音
        if($req->hasFile('source')){
            $file = $req->file('source');
            $allowed_extensions = ["mp3", "ogg", "wav"];

            if ($file->getClientOriginalExtension() && !in_array($file->getClientOriginalExtension(), $allowed_extensions)) {
                $this->error(['msg'=>'音频格式支持'.implode(',',$allowed_extensions)]);
            }

            // if($file->getSize()>1048576){
            //     $this->error(['msg'=>'音频时长不能大于1分钟']);
            // }
            $path = $file->storeAs(
                'upload/source/postcart', $userdata['id'].'_'.time().'.'.$file->getClientOriginalExtension()
            );
        }

然后就是读/显示文件:

   //显示图片/视频/音频
    public function show_file(Request $req){
        //获取当前的url
        $real_path = $path = str_replace('storage/','',$req->path());
        $path = storage_path() .  '/app/' .$real_path;
        
        $path = str_replace('\\','\\',$path);
        $path = str_replace('/','\\',$path);
        $path = str_replace('\\','/',$path);

        //查看目录下是否存在文件
        if(!file_exists($path)){
            //报404错误
            header("HTTP/1.1 404 Not Found");
            header("Status: 404 Not Found");
        }

        $extends = pathinfo($path,PATHINFO_EXTENSION); //文件扩展名

        //视频文件
        if(in_array($extends,['mp4','3gp'])){
            $mimetype = '';
            switch ($extends) {
                case 'mp4':
                    $mimetype.='video/mp4';
                    break;
                case '3gp':
                    $mimetype.='video/3gp';
                    break;
                default:
                    header("HTTP/1.1 404 Not Found");
                    header("Status: 404 Not Found");die;
            }
            return response()->stream(function () use ($path) {
                echo file_get_contents($path);
            }, 200, ['Content-Type' => $mimetype]);
        }elseif(in_array($extends,['jpg','jpeg','png'])){ //图片文件
            $mimetype = '';
            switch ($extends) {
                case 'jpg':case 'jpeg':
                    $mimetype.='image/jpeg';
                    break;
                case 'png':
                    $mimetype.='image/png';
                    break;
                default:
                    header("HTTP/1.1 404 Not Found");
                    header("Status: 404 Not Found");die;
            }
            return response()->stream(function () use ($path) {
                echo file_get_contents($path);
            }, 200, ['Content-Type' => $mimetype]);
        }elseif(in_array($extends,["mpeg", "ogg", "wav"])){//音频文件
            $mimetype = '';
            switch ($extends) {
                case 'mpeg':
                    $mimetype.='audio/mpeg';
                    break;
                case 'ogg':
                    $mimetype.='audio/ogg';
                    break;
                case 'wav':
                    $mimetype.='audio/wav';
                    break;
                default:
                    header("HTTP/1.1 404 Not Found");
                    header("Status: 404 Not Found");die;
            }
            return response()->stream(function () use ($path) {
                echo file_get_contents($path);
            }, 200, ['Content-Type' => $mimetype]);
        }else{
            //...
        }
    }

这两个功能其实就搞了一个下午(功能还不算完善),自己都不能相信自己;其实就是自己没有发现错误

1.$path要不错在路径是”\\”,所以”\v”就被php转义了,读不出来

2.laravel中使用storage_path(),返回的是”x:\\dirone\\storage”,拼接”storage/xx/xx”时候没有去掉storage;还有没有再加一个”\”: storage_path().’\’.’storage/xx/xx’

之后就一直上网百度,为什么找不出呢,磨蹭了几个小时在哪修改;其实当时就该多对比一下拼接出来的真实路径

总结:不够细心,不够细心,不够细心;被问题困扰了心境,浮躁起来了;

还有爱护好眼睛,明天不能一整天盯住了,看的怀疑人生


暂无评论

发表评论