上传多个文件时收到错误finfo_file(C:\xampp\tmp\php29C.tmp): failed to open stream: No such file or directory
。
尝试在$model->save();
之前插入saveAs()
,但之后只上传了一个文件而不是所有文件,也没有获取数据库中的路径正在上传
控制器:
public function actionCreate()
{
$model = new RoomTypes();
if ($model->load(Yii::$app->request->post()))
{
$imageName = $model->room_type;
$model->file = UploadedFile::getInstances($model, 'file');
foreach ($model->file as $file_instance)
{
$model->save();
$file_instance->saveAs('uploads/room_img/' . $file_instance->baseName . '.' . $file_instance->extension);
//save the path in the db column
$file_instance->$model->images = 'uploads/room_img/'.$imageName.'.'.$file_instance->extension;
return $this->redirect(['view', 'id' => $model->id]);
}
}
else
{
return $this->render('create',
[
'model' => $model,
]);
}
}
答案 0 :(得分:0)
我可能已经在您的评论后的最后一次更新中回复了此here,但我在这里添加了一个不同的答案,因为这是另一个不同的问题。保存文件后使用$file_instance->baseName
或$file_instance->extension
时会抛出此错误。 saveAs()其内容如下:
public function saveAs($file, $deleteTempFile = true)
{
if ($this->error == UPLOAD_ERR_OK) {
if ($deleteTempFile) {
return move_uploaded_file($this->tempName, $file);
} elseif (is_uploaded_file($this->tempName)) {
return copy($this->tempName, $file);
}
}
return false;
}
默认情况下将布尔$deleteTempFile
参数设置为 true 。这意味着它将在保存后删除临时文件,您将无法再次在同一请求中保存上传的文件。如果需要,您可以通过执行以下操作将其设置为 false :
$file_instance->saveAs('...',false)
但是在这种情况下它不会是一个好习惯,因为你得到同一个文件的2份副本。如果文件已保存到新路径,那么为什么不从tmp
文件夹中删除它。只需在调用saveAs()之前将该路径保存在变量中,并在需要时使用它,就像在上面链接的答案中一样:
$path = 'uploads/room_img/' . $file_instance->baseName . '.' . $file_instance->extension;
$file_instance->saveAs($path);
$model->images = $path;
您需要解决的其他问题包括:
foreach ($model->file as $file_instance)
{
$model->save();
$model->images = $path;
}
$model->save()
这里没有逻辑。您有一个对象和foreach文件实例的单个实例存储在其属性$model->file
中,您将一次又一次地保存孔模型。我从第二个($model->images = $path
)了解到,您的模型具有属性images
,您可以为其指定字符串值。但是这里有多个图像,每个图像都有自己的路径,在循环内部,每次使用下一个图像路径字符串时都会覆盖它。如果是这种情况我可能会存储文件夹的路径,我可以在以后找到所有这些图像:
$model->images = 'uploads/room_img/[a_collection_id_or_wathever_unique]/'
在该文件夹中,我将托管相关图像。或者我可以通过在循环中执行此操作来托管由;
分隔的所有路径或等效路径:
$model->images .= $path . ';';
如果images
是由 ActiveRecord 类表示的相关模型,则上面链接的答案应该修复它。