首页 > 解决方案 > Yii2 Ajax 使用 FormData 提交 - 控制器未收到 POSTED 文件数据

问题描述

我有一个使用 Ajax POST 的 activeform,并且正在发送表单字段,但似乎文件数据不是。这是我文件中逻辑相关的代码片段,在它们下面是使用 JS 警报和结果对测试的评论

主动形式:

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

阿贾克斯提交:

$script = <<< JS

$('form#{$model->formName()}').on('beforeSubmit', function(event)
{

    event.preventDefault();


    var form = $(this);

        formdata = new FormData(form[0]);

            $.ajax({
            url    : form.attr('action'),
            data        : formdata,
            cache       : false,
            contentType : false,
            processData : false,
            type        : 'POST',

            success: function (response) 
            {   
                alert(JSON.stringify(response.status);
                $.pjax.reload({container:'#usergrid'});
                $(form).trigger('reset'); 


            },
            });
            return false;
         });


JS;
$this->registerJs($script);

?>

模型:

use yii\web\UploadedFile;

class Usermanager extends \yii\db\ActiveRecord
{
    public static function tableName()
    {
        return 'user';
    }

    public $userphoto;

    public function rules()
    {
        return [

        [['userphoto'], 'file', 'extensions' => 'jpg, png, gif', 
'skipOnEmpty' => true],

控制器:

namespace app\controllers;

use Yii;
use app\models\Usermanager;
use yii\web\Controller;
use yii\web\Response;
use yii\web\UploadedFile;

class UsermanagerController extends Controller
{

 public function actionCreate()
 {
  $model = new Usermanager();


  if(Yii::$app->request->isAjax && $model->load(Yii::$app->request->post()) && Yii::$app->request->enableCsrfValidation)
  {
    Yii::$app->response->format = 'json';

    $userphoto = UploadedFile::getInstance($model, 'userphoto');
    /* return ['status' => $userphoto];  */
    $model->photo = "web/". $model->username. "." .$userphoto->extension;


        if($model->password !==''){
            $model->password = Yii::$app->security->generatePasswordHash($model->password);
        }

    if($model->validate())
    {   

        $model->save();

    }
    else
    {
    return ActiveForm::validate($model);  
        }
    }

   return $this->renderAjax('create', [
      'model' => $model
    ]);

  }

这是JS警报测试结果:

测试 - (控制器收到 POST)

$userphoto = UploadedFile::getInstance($model, 'userphoto');
return ['status' => $userphoto];

测试结果 -> alert(JSON.stringify(response.status)):

{"name":"kde.jpg","tempName":"/tmp/phpjp3i4d",
"type":"image/jpeg","size":51253,"error":0}

如您所见,警报详细说明了文件属性,就像收到文件一样。但是,如果尝试获取文件扩展名,则:

$model->photo = "web/". $model->username. "." .$userphoto->extension;

找不到扩展名。此外,我还尝试使用 $userphoto->saveAs 进行保存,但是 console.log 报告无法保存 null()。

那么是否有人使用 YII2 成功集成了 AJAX 提交和文件上传,但可能没有使用 Kartik 小部件?

标签: phpajaxyii2

解决方案


推荐阅读