SplFileInfo::getSize(): stat failed 记一次laravel 图片上传报错

在使用 laravel 框架上传图片的时候,本地没有出现过报错,但是部署的时候出现了,错误信息为 SplFileInfo::getSize(): stat failed ...
导致错误的代码如下:

$file->move($path, $file_name);
$model = \App\Models\File::create([
    'user_id' => auth('api')->id() ?? 0,
    'size' => $file->getSize(),
    'mine_type' => $file->getClientMimeType(),
    'original_name' => $file->getClientOriginalName(),
    'original_extension' => $file->getClientOriginalExtension(),
    'save_path' => $floder . '/' . $file_name
]);

错误原因是先调用了 move() 方法保存了图片,后调用 getSize() 方法获取文件大小,为什么会出现这种错误,php官方文档 上已经有人做了比较好的解释。

If you're using Symfony's UploadedFile,  
please be aware that if you call this method  
_after_ you call @move, you will most likely get  
some obscenely untraceable error, that says:

`stat failed`

Which if you really think about it, it does makes sense,  
the file has been moved by Symfony, but getSize is in SplFileInfo,  
and SplFileInfo doesn't know that the file has been moved.

Weirdly enough, that error doesn't come on my work mac :|

译:

如果你正在使用 Symfony's UploadedFile,在调用了 move 方法之后再调用 SplFileInfo::getSize 要当心,
你很可能会得到一个难以发现的错误:

`stat failed`

如果你仔细思考,你会发现这是合理的。上传的文件已经被 Symfony 移动走了,
但是 getSize 方法属于 SplFileInfo ,然而 SplFileInfo 并不知道文件被移走了。

奇怪的是,这个问题并没有出现在我的 mac 上。(注: 我的 homestead 环境也没出现,很尴尬)

所以,解决这个问题就是要在 move 方法调用之前调用 SplFileInfo 中的方法。

Tags:,

Add a Comment

电子邮件地址不会被公开。 必填项已用*标注