作为程序员一定要保持良好的睡眠,才能好编程

laravel文件上传并上传到oss

发布时间:2019-05-26



获取上传的文件

可以使用 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);