本文目录导读:

- 文件系统(Storage)新方法
- 上传文件(UploadedFile)新方法
- 流式处理(Streamed Responses)
- 临时文件处理
- 目录操作便捷方法
- 跨平台路径操作
- 文件锁(Laravel 11+)
- 其他实用改进
- 测试辅助方法
- 推荐重点掌握
截至 2025 年 5 月,Laravel 在文件操作方面确实引入了一些新方法和改进,主要集中在 Storage(文件系统)、上传、流式处理 以及 本地文件操作 上,以下是值得关注的新方法或改进(基于 Laravel 11.x 及后续版本):
文件系统(Storage)新方法
putFileAs 和 putFile 的增强
putFileAs:可以直接指定文件名,避免随机生成。putFile:自动生成唯一文件名,但新增了visibility参数支持(public/private)。
use Illuminate\Support\Facades\Storage;
// 上传到 S3,并自定义文件名
$path = Storage::disk('s3')->putFileAs('photos', $request->file('photo'), $photoName, 'public');
stream 方法(直接流式上传/下载)
Storage::disk('s3')->stream($path, $resource):支持resource资源,适合大文件。Storage::disk('local')->stream($path):返回一个StreamedResponse用于下载。
// 流式上传(减少内存占用)
$stream = fopen('/tmp/largefile.zip', 'r');
Storage::disk('s3')->writeStream('path/file.zip', $stream);
fclose($stream);
// 流式下载
return Storage::disk('local')->stream('secret.pdf');
temporaryUrl 增强
- 支持自定义过期时间(秒数),并可选
options数组(如签名版本)。 - Laravel 11+ 新增:
temporaryUrl现在可直接用于local磁盘(通过临时路由)。
$url = Storage::disk('local')->temporaryUrl('file.pdf', now()->addMinutes(10));
直接操作文件夹
ensureDirectoryExists:确保目录存在(不报错)。deleteDirectory:递归删除目录(Laravel 11 性能优化)。
Storage::disk('public')->ensureDirectoryExists('avatars/team1');
Storage::disk('public')->deleteDirectory('old_logs');
上传文件(UploadedFile)新方法
storeAs 和 store 的改进
- 新增
visibility参数(S3 等云存储有用)。 storeAs:支持$options数组,如['disk' => 's3', 'visibility' => 'public']。
$path = $request->file('photo')->storeAs('photos', $photoName, ['disk' => 's3', 'visibility' => 'public']);
hashName 增强
- 支持自定义长度(默认 40 字符)。
- 新增
hashName('original')保留原始扩展名。
$newName = $request->file('doc')->hashName('original'); // abc123.pdf
getClientOriginalName 安全增强
- 返回经过清理的原始文件名(移除路径攻击符号)。
流式处理(Streamed Responses)
StreamedResponse 结合文件系统
Storage::download返回StreamedResponse,支持断点续传。Storage::serve(Laravel 11+):直接流式输出文件,适合大文件下载(不会占用 PHP 内存)。
// 大文件下载
return Storage::disk('local')->serve('backup/site.zip');
临时文件处理
TempFile 类(Laravel 11+)
- 自动清理临时文件。
- 适合生成临时报告、预览等。
use Illuminate\Filesystem\TempFile;
$temp = new TempFile();
$temp->put('临时内容');
// 使用完后自动删除
目录操作便捷方法
allFiles:递归获取所有文件(Laravel 11 性能优化,减少 I/O)。directories:只获取子目录(新增深度参数)。
$files = Storage::disk('public')->allFiles('photos', true); // 包含子目录
$dirs = Storage::disk('public')->directories('data', 2); // 只取2层深度
跨平台路径操作
Storage::path($path):获取绝对路径(Laravel 11+ 支持 Windows 路径兼容)。Storage::publishablePath():获取可发布的资源路径(用于包开发)。
文件锁(Laravel 11+)
Storage::lock:对文件进行独占锁定(防止并发写入)。Storage::tryLock:尝试获取锁(非阻塞)。
Storage::lock('cache/myapp.json', function ($path) {
file_put_contents($path, serialize($data));
});
其他实用改进
| 方法 | 说明 |
|---|---|
Storage::drive('local')->lastModified() |
优化性能,减少 stat 调用 |
Storage::disk('s3')->exists() |
支持通配符 检查多个文件 |
Storage::disk('local')->move($from, $to) |
支持跨磁盘移动(Laravel 11+ 内部支持) |
测试辅助方法
Storage::fake('local')增强:新增assertFileExists、assertFileMissing等断言方法。Storage::fake('s3')支持模拟temporaryUrl。
Storage::fake('public');
Storage::disk('public')->put('test.txt', 'content');
Storage::disk('public')->assertFileExists('test.txt');
推荐重点掌握
- 流式上传/下载:
stream()、writeStream()、serve() - 临时文件:
TempFile类 - 文件锁:
lock()/tryLock() - Temporary URL 本地化:本地磁盘也支持临时签名 URL
- 上传文件名安全:
hashName('original')+ 自动清理
如果你使用的是 Laravel 10,部分方法可能不完整;建议升级到 Laravel 11+ 以获得最佳体验。