2017-10-11 47 views
1

我有一个提交文本输入和文件输入的窗体(非活动窗体)。我可以保存文本字段但未检测到文件。在yii2中上传没有活动窗体的文件

查看:

<form id="data" method="post" enctype="multipart/form-data"> 
<div class="form-group"> 
    <label>bicycle_no</label> 
    <input class="form-control" name="bicycle_no" placeholder="" type="text" /> 
</div> 
<div class="form-group"> 
    <label>image</label> 
    <input class="form-control" name="file" type="file"> 
</div> 
<div class="form-group"> 
    <a href="<?=Yii::$app->homeUrl?>/site/index" class="btn btn-danger">Cancel</a> 
    <button class="btn btn-primary">Save</button> 
</div> 
</form> 

我可以在控制器获取图像:

if(!empty($_FILES['file']['name'])) { 
    //var_dump($_FILES['file']; // <<-- shows image data 
    $model['image_uploaded'] = $this->upload(); 
} 

public function upload(){ 

    $model = new UploadImage(); 
    $model->load(Yii::$app->request->post()); 

    $path = Yii::getAlias('@frontend') .'/web/upload/couriers/images/'; 
    //return $path; 

    $model->file = UploadedFile::getInstance($model, 'file'); 
    echo json_encode($model->file); # <<--- shoes nothing 
     $model->path = $path; 
     if($model->upload()){ 
      return true; 
     }else{ 
      return $model->getErrors(); 
     } 
} 

,我得到的错误如下:

Please upload a file! 

任何帮助将是最受欢迎!

+0

检查模型加载发布数据? –

+0

没有发布的数据没有加载到$ model – goseo

回答

4

你必须改变两两件事:

$model->load(Yii::$app->request->post()); 

到:

$model->load(Yii::$app->request->post(), ''); 

$model->file = UploadedFile::getInstance($model, 'file'); 

到:

$model->file = UploadedFile::getInstanceByName('file'); 

这是因为你没有在表单中使用你的模型。方法load()得到2个参数,第一个是$data--你已经知道了,第二个是$formName。默认设置为null,但如果它是null,它将从您的模型中准备表单名称,例如YourModel[data_key]。在你的情况下,你不使用ActiveForm和模型来生成表单,所以你没有在你的HTML表单名称。通过将此设置为'',您可以告诉ActiveRecord以无形式加载数据。

+0

OMG,它工作!谢谢你,Yupik。我不会想出这样的解决方案。那么,什么是'$ model-> load(Yii :: $ app-> request-> post(),'');'真的吗? – goseo

+0

回答更新:) – Yupik