laravel-保存和显示多媒体
今天是工作的第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’
之后就一直上网百度,为什么找不出呢,磨蹭了几个小时在哪修改;其实当时就该多对比一下拼接出来的真实路径
总结:不够细心,不够细心,不够细心;被问题困扰了心境,浮躁起来了;
还有爱护好眼睛,明天不能一整天盯住了,看的怀疑人生
快捷登陆