获取上传的文件
可以使用 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 文档 可以获取这些方法的更多信息。
存储上传文件
要存储上传的文件,先配置好 文件系统。你可以使用 UploadedFile 的 store 方法把上传文件移动到你的某个磁盘上,该文件可能是本地文件系统中的一个位置,甚至像 Amazon S3 这样的云存储位置。
store 方法接受相对于文件系统配置的存储文件根目录的路径。这个路径不能包含文件名,因为系统会自动生成唯一的 ID 作为文件名。
store 方法还接受可选的第二个参数,用于存储文件的磁盘名称。这个方法会返回相对于磁盘根目录的文件路径:
$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');
文件上传
在 web 应用程序中,最常用到的文件存储的场景的地方就是上传头像,照片和文件。
Laravel 上传文件的实例方法 store 可以轻松的处理文件上传存储问题。你只需要调用带有文件保存路径作为参数的 store 方法即可:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Controllers\Controller; class UserAvatarController extends Controller { /** * 更新用户头像. * * @param Request $request * @return Response */ public function update(Request $request) { $path = $request->file('avatar')->store('avatars'); return $path; } }
上例有几个点需要注意。我们指定的是目录名,而不是文件名。
默认情况下, store 方法会自动生成唯一的 ID 作为文件名。
文件的扩展名将通过检查文件的 MIME 类型来确定。
该文件的路径和文件名会被 store 方法返回,以便后续数据库的存储使用。
你也可以使用 Storage facade 上的 putFile 方法达到和上例同样的效果:
$path = Storage::putFile('avatars', $request->file('avatar'));
指定文件名
如果你不想将文件名自动分配给存储的文件,
可以使用 storeAs 方法,该方法接受路径,文件名和 (可选) 磁盘作为其参数:
$path = $request->file('avatar')->storeAs( 'avatars', $request->user()->id );
你可以使用 Storage facade 上的 putFileAs 方法达到和上例同样的文件操作:
$path = Storage::putFileAs( 'avatars', $request->file('avatar'), $request->user()->id );
保存文件
put 方法可用于将原始文件内容保存到磁盘上。你也可以传递 PHP 的 resource 给 put 方法,
它将使用文件系统下的底层流支持。强烈建议在处理大文件时使用此方法:
use Illuminate\Support\Facades\Storage; Storage::put('file.jpg', $contents); Storage::put('file.jpg', $resource);
自动流式传输
如果你想 Laravel 自动将给定文件流式传输到你的存储位置,你可以使用 putFile 或 putFileAs 方法。
这个方法接收 Illuminate\Http\File 或 Illuminate\Http\UploadedFile 实例,并自动将文件流式传输到你想要传输的位置:
use Illuminate\Http\File; use Illuminate\Support\Facades\Storage; // 自动为文件名生成唯一的ID... Storage::putFile('photos', new File('/path/to/photo')); // 手动指定文件名... Storage::putFileAs('photos', new File('/path/to/photo'), 'photo.jpg');
下载文件
download 方法可用于生成一个响应,强制用户的浏览器在给定路径下载文件。 download 方法接受一个文件名作为该方法的第二个参数,它将确定用户下载文件时看到的文件名。最后,你可以传递一个 HTTP 数组头作为该方法的第三个参数:
return Storage::download('file.jpg'); return Storage::download('file.jpg', $name, $headers);