我有一个控制器操作,通过ajax请求接受文件上传,并保存有关该文件的基本信息。如果保存成功,则执行saveAs()以将文件实际保存到文件系统。有点像这样:
if ($model->save()) {
$file->saveAs('uploads/' . $file->baseName . '.' . $file->extension);
}
一切都很好但我想围绕saveAs()实施检查,这样我就可以删除刚刚插入的记录,如果由于某种原因,文件无法保存。我看到UploadedFile有一个$hasError
和$errors
但是如果保存文件代码执行时出现问题似乎停止在saveAs()处,而不是移过它实际让我处理错误。
如果存在问题,是否有办法捕获saveAs()错误并执行某些逻辑?
修改
我尝试过分配返回变量,如下所示。但是,这是我第一次注意到如果发生saveAs()错误,没有代码通过saveAs()执行。
$saveResult = $file->saveAs('uploads/' . $file->baseName . '.' . $file->extension);
// Any code down here won't be executed if (for example)
// that "uploads" directory doesn't exist and the saveAs() fails
答案 0 :(得分:1)
如果此代码抛出异常(目录不存在,不可写等),您可以使用常规的try-catch块来处理:
try {
$file->saveAs(...);
} catch (\Exception $e) {
...
}
阅读有关exceptions的官方PHP文档。
另一种方法是添加检查以防止所有最常见的错误:
if (!is_dir($uploadPath)) {
...
}
如果此类目录不存在,等等。
为了摆脱这种情况,我建议编写测试并在部署脚本中创建该文件夹(如果它们不存在)。