Загрузка видео на Yii2 показывает ошибку # 400

#file-upload #yii2

#загрузка файла #yii2

Вопрос:

Пожалуйста, фотографии загружаются, но загрузка видео отображается Bad Request (#400) Unable to verify your data submission . Пожалуйста, что может быть причиной? Я не редактировал enableCsrfValidation в контроллере. Заранее спасибо за помощь. Ниже приведены коды (Yii2.0.8).
Модель.

 public function uploader() {

    $file = UploadedFile::getInstanceByName('file');
    if(!$this->validate()){
            Yii::$app->session->setFlash('warning', implode(', ', $this->firstErrors));
            return FALSE;
        }

    if($file amp;amp; $file !== NULL){
        $pic = $this->mediaType($file);
        $path = Yii::getAlias('@webroot').$pic;
        if(!$file->saveAs($path)){
            Yii::$app->session->setFlash('error', 'Upload Error: '.$file->error);
            return FALSE;
        }
        $this->file = Yii::getAlias('@web').$pic;
    } elseif (!$this->isNewRecord) {
        //no upload was initiated and it is not a new record, assign old value
        $this->file = $this->getOldAttribute('file');
    } else {
        //it is a new record and no upload was initiated
        $this->file = '';
    }

    if(!$this->save('false')){
        Yii::$app->session->setFlash('error', 'Saving To Database Error: '. implode(', ', $this->firstErrors));
        return FALSE;
    }
    Yii::$app->session->setFlash('success', 'SAVED SUCCESSFULLY!');
    return TRUE;
}

/**
 * check if extention is in video format to determine which folder to save file
 * @param UploadedFile $file
 * @return string
 */
public function mediaType(UploadedFile $file) {
    if(yii2modhelpersArrayHelper::isIn($file->extension, ['mp4', '3gp', 'mpeg4'])){
        return '/files/videos/users/posts/'.Yii::$app->user->id.'-'.$file->baseName.'.'.$file->extension;
    }
    return '/files/images/users/posts/'.Yii::$app->user->id.'-'.$file->baseName.'.'.$file->extension;
}  
 

Вид

 <div class="holder"></div>
<div class="message-form ">
<?php $form = ActiveForm::begin([
    'id' => 'updates-form',
    'options' => [
        'validationUrl' => 'url/validate'
    ]
]);  
<div class="container-fluid" id="wrap-picker">
<div id="placer"></div>
<div class="row media">
<div id="camera-wrap" class="col-xs-8 col-sm-5">
<?= $form->field($model, 'file',['inputOptions' => ['accept'=>"image/*;capture=camera", 'class' => 'do-camera']])->fileInput()->label('') ?>             
</div>
<div class="col-xs-4 col-sm-7">
<i id="media-remove"><i class="fa fa-remove fw" ></i> Remove</i>
</div>
</div>          
<div class="center">
<i id="camera-picker" class="media-picker"> <i class="hint">Picture</i>  
<i class="fa fa-camera-retro" ></i> </i> amp;nbsp; amp;nbsp; amp;nbsp; <i id="video-picker" class="media-picker"><i class="hint">Video</i> <i class="fa fa-video-camera" ></i></i>
</div>
</div>  
</div>
<?php ActiveForm::end();?>
</div>
<?php
$js = <<< JS
function hideMedia(){
    $(".media").appendTo(".holder");
    $(".media").hide();
}
hideCamera();
$(".media-picker").click(function(){
//ensure .media is visible and child to #placer before calling trigger
if($("#wrap-picker").find($(". media")).length !== 1){
     $(".media").fadeIn();
     $(". media").appendTo("#placer");
 }         
 $(".do-camera").trigger('click');
});
$("#video-picker").click(function(){
    $(".do-camera").removeAttr('accept');
    $(".do-camera").attr("accept", "video/*;capture=camcoder");
});
$("#camera-picker").click(function(){
    $(".do-camera").removeAttr('accept');
    $(".do-camera").attr("accept", "image/*;capture=camera");
    });
$("#media-remove").click(function(){
    hideMedia();
});  
JS;  
$this->registerJs($js);
?>
 

Ответ №1:

Попробуйте установить для enableCsrfValidation значение false, значение по умолчанию равно true, и вы не отправили _csrf, и это приводит к ошибке.

PS: извините за мой английский)

Комментарии:

1. Почему значение _csrf не отправляется при загрузке видео? что я могу с этим поделать? Я не хочу рисковать, устанавливая значение enableCsrfValidation в false по соображениям безопасности, потому что загрузки должны выполнять общедоступные пользователи.