1

我是 Yii 2 的新手,正在阅读文档并进行实验。使用ActiveForm并尝试进行文件上传时,我不断收到错误“请上传文件”,即使在我单步执行代码时似乎已上传文件。

型号代码

public function upload()
{
    if ($this->validate())
    {
        $destination = Yii::getAlias('@app/uploads');

        $this->brochure->saveAs($destination . '/' . $this->product_id . '.' . $this->brochure->extension);
        return true;
    }
    else
    {
        return false;
    }
}

控制器代码

public function actionUpdate($id)
{
    $model = $this->findModel($id);

    if (Yii::$app->request->isPost)
    {
        $model->load(Yii::$app->request->post());
        $upload = UploadedFile::getInstance($model, 'brochure');

        if ($upload !== null)
        {
            $model->brochure = $upload;
            $result = $model->upload();
        }

        // If model is saved, update product_to_language db table for language checkboxes
        if ($model->save())
        {
            // First delete all old values in product_to_language db table
            $cmd = Yii::$app->db->createCommand()
                ->delete('product_to_language', "product_id = $model->product_id")
            ;
            $result = $cmd->execute();

            // Next update product_to_language db table
            $form = Yii::$app->request->post('Product');

            if (!empty($languages = $form['languages']))
            {
                // Create array of values for batch insert
                foreach ($languages as $language_id)
                {
                    $insert_array[] = [$model->product_id, $language_id];
                }

                $cmd = Yii::$app->db->createCommand()
                    ->batchInsert('product_to_language',
                        ['product_id', 'language_id'],
                        $insert_array
                    )
                ;
                $result = $cmd->execute();
            }

            return $this->redirect(['view', 'id' => $model->product_id]);
        }
    }

    return $this->render('update', [
        'model' => $model,
    ]);
}

_form 代码

<?php
use app\models\Product;
use app\models\Brand;
use app\models\Language;
use app\models\Color;
use app\models\Gender;
use yii\helpers\Html;
use yii\widgets\ActiveForm;

/* @var $this yii\web\View */
/* @var $model app\models\Product */
/* @var $form yii\widgets\ActiveForm */
?>


<div class="admin-product-form">

<?php $form = ActiveForm::begin(
    [
        'enableAjaxValidation' => false,
        'options' => ['enctype' => 'multipart/form-data'],
    ]
);
?>

<?php
    $errors = $form->errorSummary($model);
    echo $errors;
?>

<?= $form->field($model, 'product_name')->textInput() ?>

<?= $form->field($model, 'brand_id')->label('Brand')->dropDownList(Brand::getOptions(), ['prompt' => 'Select Brand']) ?>

<?= $form->field($model, 'price')->textInput() ?>

<?php $model->isNewRecord ? $model->color_id = 1 : $model->color_id = $model->color_id ; ?>
<?= $form->field($model, 'color_id')->dropDownList(Color::getOptions()) ?>

<?= $form->field($model, 'gender_id')->radioList(Gender::getOptions(), ['prompt' => 'Select Gender']) ?>

<?= $form->field($model, 'languages')->checkboxList(Language::getOptions()) ?>

<?= $form->field($model, 'description')->textarea(['rows' => 6, 'class' => 'tinymce', 'maxlength' => true]) ?>

<?= $form->field($model, 'brochure')->fileInput() ?>

<div class="form-group">
    <?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
</div>

<?php ActiveForm::end(); ?>

</div>

屏幕截图链接 https://www.dropbox.com/s/zfa0rj8b4pmqyss/yii%20form%20screen%20capture.png?dl=0

4

2 回答 2

0

另外,不要忘记上传目录的写权限。

确保您的 Web 服务器可以写入@app/uploads目录。

就我而言,在调用saveAs之前,我检查了存在的上传目录,并设置了写入权限。

$file_name = $model->$brochure->baseName. '.' . $model->$brochure->extension;
$path = Yii::getAlias('@app/uploads');
$full_path = $path . $file_name;

if(!is_dir($path)){                //  check path exist
     @mkdir($path, 0755, true);    //  if not, create dir and set permission
}

touch($path.'/index.htm');         // create empty index.html 
                                   // for reduce risk scan dir outside 

$model->$brochure->saveAs($full_path);

在您的示例中,此代码将是多余的,因为您可以手动检查写入权限。但是对于动态文件夹创建,这是一个很好的做法,例如对于个人用户文件夹。

于 2017-01-21T03:28:56.343 回答
0

你的模型应该有这样的正确规则brouchure

public function rules()
{
    return [
        [
            'brouchure',
            'file',
            'extensions' => ['png', 'jpg', 'jpeg', 'svg'],
            'maxSize' => 1024 * 1024
        ]
        ...
    ];
}

注意:如果你得到null属性值后load你应该检查rules. 属性对于负载应该是安全的。

于 2016-01-16T22:45:21.387 回答