Laravel文件操作有哪些新方法

wen PHP项目 3

本文目录导读:

Laravel文件操作有哪些新方法

  1. 文件系统(Storage)新方法
  2. 上传文件(UploadedFile)新方法
  3. 流式处理(Streamed Responses)
  4. 临时文件处理
  5. 目录操作便捷方法
  6. 跨平台路径操作
  7. 文件锁(Laravel 11+)
  8. 其他实用改进
  9. 测试辅助方法
  10. 推荐重点掌握

截至 2025 年 5 月,Laravel 在文件操作方面确实引入了一些新方法和改进,主要集中在 Storage(文件系统)上传流式处理 以及 本地文件操作 上,以下是值得关注的新方法或改进(基于 Laravel 11.x 及后续版本):


文件系统(Storage)新方法

putFileAsputFile 的增强

  • 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)新方法

storeAsstore 的改进

  • 新增 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') 增强:新增 assertFileExistsassertFileMissing 等断言方法。
  • Storage::fake('s3') 支持模拟 temporaryUrl
Storage::fake('public');
Storage::disk('public')->put('test.txt', 'content');
Storage::disk('public')->assertFileExists('test.txt');

推荐重点掌握

  1. 流式上传/下载stream()writeStream()serve()
  2. 临时文件TempFile
  3. 文件锁lock() / tryLock()
  4. Temporary URL 本地化:本地磁盘也支持临时签名 URL
  5. 上传文件名安全hashName('original') + 自动清理

如果你使用的是 Laravel 10,部分方法可能不完整;建议升级到 Laravel 11+ 以获得最佳体验。

抱歉,评论功能暂时关闭!