Laravel中使用File::files()返回空对象数组的问题排查
Laravel中使用File::files()返回空对象数组的问题排查
嗨,我来帮你捋清楚这个问题~
你遇到的情况其实很常见:File::files($path)返回的并不是普通的数组或字符串,而是SplFileInfo对象的集合。这些对象的内部属性大多是受保护或私有的,当你直接用response()->json($files)返回时,PHP的JSON序列化机制只会处理对象的公开属性,所以最终返回的JSON里就显示成了空对象,但数组的长度是对的——因为确实有对应数量的SplFileInfo实例存在。
解决方法:手动提取需要的文件信息
你需要把每个SplFileInfo对象转换成包含公开可访问属性的关联数组,这样JSON序列化就能正确展示内容了。可以用Laravel集合的map方法来处理:
$path = storage_path('path/to/folder/' . $request->folder); $files = File::files($path)->map(function($file) { return [ 'filename' => $file->getFilename(), // 仅文件名 'full_path' => $file->getPathname(), // 文件完整路径 'size' => $file->getSize(), // 文件大小(字节) 'extension' => $file->getExtension(), // 文件扩展名 'last_modified' => $file->getMTime(), // 最后修改时间(时间戳) // 还可以根据需求添加其他方法返回的信息 ]; }); return response()->json($files, 200);
验证小技巧
你可以在代码里先加上dd($files)来查看原始的SplFileInfo对象:
$files = File::files($path); dd($files);
这时候你会看到每个对象都包含了文件的详细信息,只是直接转JSON时无法序列化这些非公开属性而已。
备注:内容来源于stack exchange,提问作者cwmd
相关产品推荐
相关产品推荐

