写点什么

Laravel- 文件上传下载

  • 2022-11-02
    广东
  • 本文字数:2073 字

    阅读完需:约 7 分钟

Laravel-文件上传下载

前言

什么是 laravel?Laravel 是一个开源的、广泛使用的 PHP 框架,该平台主要用于利用 MVC 架构模式开发 web 应用程序。Laravel 是在 MIT 许可下发布的。


因此,其源代码托管在 GitHub 上。它遵循可靠且准确的语言规则,因此是可靠的 PHP 框架

如何使用 laravel 上传文件?

1.前端文件上传表单

和原生 PHP 基本一样, 需要添加给表单添加属性 enctype="multipart/form-data"。当然,在 laravel 中不要忘记添加{!!csrf_field()!!},下面是一个表单的例子


<form action="{{url('upload')}}" method="post" enctype="multipart/form-data" class="form-inline">    {!!csrf_field()!!}    <div class="form-group">      <input type="file" class="form-control" name="uploadfile" style="margin: 10px;">      <input type="submit" class="form-control btn btn-info" name="sub" value="上传">    </div></form>
复制代码


2.创建控制器处理上传的文件

上传的文件在 Laravel 中当然也可以使用原生的 PHP 函数进行处理。一般的处理步骤是


  1. 判断是否上传成功(已经成功上传到临时目录)

  2. 获取上传文件的相关信息,如文件临时的存放路径、文件名,文件类型,后缀名,文件大小等等

  3. 判断文件类型、文件大小等是否符合要求

  4. 把文件从临时文件复制到指定的路径


public function upload(Request $request){    if($request->isMethod("POST")){        $file = $request->file('uploadfile'); //获取上传文件相关信息,相当于获取$_ FILE['uploadfile' ]的信息        if($file->isValid()){//是否已经成功上传了            //$fname=$file->getClientOriginalName();//原文件名            $ext=$file->getClientOriginalExtension();//扩展名            //$ftype=$file->getClientMimeType();//文件类型            $tmp=$file->getRealPath();//.上传文件临时存放路径            $filename=date('Y-m-d H-i-s').'-'.uniqid().'.'.$ext;//新的文件名            $r=Storage::disk('local')->put($filename,file_get_contets($tmp));//把临时文件复制到指定的目录            if($r){                echo'上传成功';            }else{                echo'上传失败'            }        }else{            echo'上传失败'        }    }}
复制代码

3.上传文件的复制

只要文件上传成功,php 会把文件先存放到一个临时目录,如上传文件符合用户的要求,那么,下一步就是把文件从临时目录复制到指定的目录


刚刚的代码中,使用了 Storage 类的静态方法复制文件


$r=Storage::disk('local')->put($filename,file_get_contents($tmp));
复制代码


还可以使用 Request 类对象的 file 属性的 move 方法


$r=$file->move(storage_path('app'),$filename);
复制代码


当然,也可使用原生 PHP 函数 move_upload_file


$r = move_uploaded_file($tmp, storage_path('app').'/'.$filename);
复制代码

4.通过 config/filesystem.php 配置 Storage 目录

在 laravel 中,一般使用 storage 作为文件存放的目录,如存放上传或下载的文件。此目录下的文件和目录可以直接通过 Illuminate\Support\Facades\Storage 类进行读写,为了方便 Storage 类的读写,我们编辑 config/filesystem.php 键为 disks 的数组。例如,我们如果希望把上传的文件存放在 public/upload 目录下,我们可以给 disks 数组添加一个元素


'upload'=>[    'driver'=>'local',    'root'=>public_path('upload'),//public_path()获取public目录下的绝对路径]
复制代码


把 upload 控制器复制上传文件那句代码改为


$r=Storage::disk('upload')->put($filename,file_get_contents($tmp));
复制代码


即可把文件复制到 public/upload 目录下,如果 public 目录下不存在 upload 目录,函数会自动创建

5.对上传文件进行限制

一般,最常见的限制是对文件类型进行限制,可以通过对比文件扩展名或文件类型判断上传文件的类型是否符合要求


例如,修改前面 upload 类 upload 方法,通过扩展名对比来判断


$ext=$file->getClientOriginalExtension();$word=['doc','docx','txt'];if(!in_array($ext,$word)){    die('文件类型符合要求')}
复制代码

如何使用 laravel 下载文件?

download 函数

使用 Laravel 的 Reponse 类对象的 download 方法,可以很方便的下载文件,download 方法可以用来生成强制用户浏览器下载指定路径文件的响应


此函数有三个参数,第一个参数为要下载文件的路径,必填;第二个参数接受一个文件名,它将作为用户下载的时所看见的文件名,选填;最后,你可以传递一个 HTTP 响应头数组作为该方法的第三个参数,如下:


return response()->download($pathToFile);return response()- >download($pathToFile, $name, $headers);returm response()->download($pathToFile)->deleteFileAfterSend(true);
复制代码

附:laravel 常用路径函数

app_path()app_path 函数返回 app 目录的绝对路径


base_path()base_path 函数返回项目根目录的绝对路径


config_path()config_path 函数返回应用配置目录的绝对路径


database_path()database_path 函数返回应用数据库目录的绝对路径


public_path()public_path 函数返回 public 目录的绝对路径


storage_path()storage_path 函数返回 storage 目录的绝对路径

发布于: 刚刚阅读数: 4
用户头像

还未添加个人签名 2022-11-01 加入

还未添加个人简介

评论

发布
暂无评论
Laravel-文件上传下载_php_格斗家不爱在外太空沉思_InfoQ写作社区