本文目录导读:

- 文件系统(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+ 以获得最佳体验。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播