文件上传
获取上传的文件

可以使用 Illuminate\Http\Request 实例提供的 file 方法或者动态属性来访问上传文件, file 方法返回 Illuminate\Http\UploadedFile 类的一个实例,该类继承自 PHP 标准库中提供与文件交互方法的 SplFileInfo 类:

$file = $request->file('photo');
$file = $request->photo;

你可以使用 hasFile 方法判断文件在请求中是否存在:

if ($request->hasFile('photo')) {
//
}

验证文件是否上传成功

使用 isValid 方法判断文件在上传过程中是否出错:

if ($request->file('photo')->isValid()){
//
}

文件路径 & 扩展名

UploadedFile 类还提供了访问上传文件绝对路径和扩展名的方法。 extension 方法可以基于文件内容判断文件扩展名,该扩展名可能会和客户端提供的扩展名不一致:

$path = $request->photo->path();
$extension = $request->photo->extension();

其他文件方法

UploadedFile 实例上还有很多其他可用方法,查看该类的API文档了解更多信息。

保存上传的文件

要保存上传的文件,需要使用你所配置的某个文件系统,对应配置位于 config/filesystems.php

Laravel 默认使用 local 配置存放上传文件,即本地文件系统,默认根目录是 storage/apppublic 也是本地文件系统,只不过存放在这里的文件可以被公开访问,其对应的根目录是 storage/app/public,要让 Web 用户访问到该目录下存放文件的前提是在应用入口 public 目录下建一个软链 storage 链接到 storage/app/public

UploadedFile 类有一个 store 方法,该方法会将上传文件移动到相应的磁盘路径上,该路径可以是本地文件系统的某个位置,也可以是云存储(如Amazon S3)上的路径。

store 方法接收一个文件保存的相对路径(相对于文件系统配置的根目录 ),该路径不需要包含文件名,因为系统会自动生成一个唯一ID作为文件名。

store 方法还接收一个可选的参数 —— 用于存储文件的磁盘名称作为第二个参数(对应文件系统配置 disks 的键名,默认值是 local),该方法会返回相对于根目录的文件路径:

$path = $request->photo->store('images');
$path = $request->photo->store('images', 's3');

如果你不想自动生成文件名,可以使用 storeAs 方法,该方法接收保存路径、文件名和磁盘名作为参数:

$path = $request->photo->storeAs('images', 'filename.jpg');
$path = $request->photo->storeAs('images', 'filename.jpg', 's3');

下面我们来简单演示下文件上传功能,在 routes/api.php 中定义如下文件上传路由:

Route::post('file/upload', function(\Illuminate\Http\Request $request) {
if ($request->hasFile('photo') && $request->file('photo')->isValid()) {
$photo = $request->file('photo');
$extension = $photo->extension();
//$store_result = $photo->store('photo');
$store_result = $photo->storeAs('photo', 'test.jpg');
$output = [
'extension' => $extension,
'store_result' => $store_result
];
print_r($output);exit();
}
exit('未获取到上传文件或上传过程出错');
});

我们还是使用 Advanced REST Client 工具来演示 POST 表单提交:

标记红圈的地方是需要重点关注的输入和输出。我分别测试了 store 方法和 storeAs 方法,上传文件成功后可以去 storage/app 目录下查看:

其他存储介质使用方式也差不多,无非是修改下 storestoreAs 对应的参数。在使用过程中遇到什么问题,欢迎在评论区反馈。

Laravel 上传文件处理的更多相关文章

  1. laravel上传文件到七牛云存储

    背景 最近在用PHP和laravel框架做一个图片网站,需要将图片存贮到云端,搜索下了对比了下功能,发现七牛云存储不错(主要小流量免费),便选择使用七牛作为图片存储空间. 要实现的功能很简单,选择本地 ...

  2. ftp配置 Laravel上传文件到ftp服务器

    listen=YES anonymous_enable=NO local_enable=YES write_enable=YES local_umask= dirmessage_enable=YES ...

  3. laravel上传文件FTP驱动配置

    FTP驱动配置 Laravel 的文件系统集成了 FTP 操作,不过,框架默认的配置文件 filesystems.php 并没有提供示例配置.如果你需要配置一个FTP文件系统,可以使用以下示例配置: ...

  4. Laravel上传文件(单文件,多文件)

    为了方便,先修改一个配置文件,再laravel框架中config配置中找到  filesystems.php 文件 修改代码如下 'local' => [ 'driver' => 'loc ...

  5. laravel 上传文件到亚马逊 aws s3

    参考: https://github.com/aws/aws-sdk-php-laravel https://www.jianshu.com/p/e48d82bff20b

  6. Laravel操作上传文件的方法

    1.获取上传的文件 $file=$request->file('file');2.获取上传文件的文件名(带后缀,如abc.png) $filename=$file->getClientOr ...

  7. php使用sftp上传文件

    搞这个SFTP文件传输搞了一整天真是醉了,从sftp安装,到php的ssh2扩展安装,最后到php应用ssh2来上传文件:最后就没有最后了 Failure creating remote file: ...

  8. Laravel5.1 搭建博客 --上传文件及文件管理

    教程源自:Laravel学院 这一节 咱来说说上传文件的功能实现,我们会把上传的文件保存到项目本地,不仅上传 还有删除和预览功能. 1 配置 我们先从配置开始做起,先修改我们自己创建的 blog.ph ...

  9. egg.js 通过 form 和 ajax 两种方式上传文件并自定义目录和文件名

    egg.js 通过 form 和 ajax 两种方式上传文件并自定义目录和文件名 评论:10 · 阅读:8437· 喜欢:0 一.需求 二.CSRF 校验 三.通过 form 表单上传文件 四.通过 ...

随机推荐

  1. 用Navicat复制数据库到本地(导入.sql文件运行)

    今天装数据库的机子没开,项目运行不了,于是还是决定在自己电脑上装数据库,由于新学数据库操作,记录一下 一.转储sql文件 右键点击数据库,转储sql文件,点击结构和数据 存放在本地,开始转储 转储完成 ...

  2. Mac: iTerm2使用

    From: http://www.cnblogs.com/noTice520/p/3190529.html 之前一直有朋友要我分享下在用的mac软件,今天有空就来写一下,可能不止于软件,会有一些配置或 ...

  3. Javascript-自己定义对象转换成JSon后怎样再转换回自己定义对象

    man是自己定义的对象,使用var tim = JSON.stringify(man); var newman=JSON.parse(tim)后newman的类型是"object" ...

  4. SEO -- WP如何建立SiteMap

    站点地图对网站的seo优化有着相当重要的作用,而WordPress的优势就是插件特别的多,也特别符合蜘蛛的口味,在wp上建立站点地图是相当简单的事情,只需要一款插件和几步简单的配置 Google XM ...

  5. bzoj 4823 [Cqoi2017]老C的方块——网络流

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4823 一个不合法方案其实就是蓝线的两边格子一定选.剩下两部分四相邻格子里各选一个. 所以这个 ...

  6. memcache 命令行操作

    今天找了很久,如何在服务器直接查看memcache 的值, 来确定php中memcache是否已经写进去了 https://www.ttlsa.com/memcache/memcache-list-a ...

  7. 1021 docker prometheus监控体系

    jmeter plugin监控的信息很少,只有cpu.内存.网络IO,但这些是不够的.例如对于分析mysql数据库的慢查询.最大连接数等更加细密度的信息. 服务端稳定测试的三个前提: 1.应用级别的自 ...

  8. 在ubuntu 18.04下,无线网卡无驱动,连不上wifi,显示wifi没有适配器的解决方法

    近来因为做东西要用到linux环境,所以自己的笔记本在win10的系统上又安装了ubuntu 18.04版本的双系统,但是安装好以后,没有无线网卡的驱动,显示wifi没有适配器等字样,很纠结,前后研究 ...

  9. Lifecycle of an ASP.NET Web API Message

    ASP.NET Web API, as we know now, is a framework that helps build Services over HTTP. Web API was int ...

  10. 通过日志查看Web Api详细运行过程

    1. 通过Nuget安装System.Web.Http.Tracing. 2. 通过HttpConfiguration,注册SystemDiagnosticsTraceWriter public st ...