php - 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 小部件?
解决方案
推荐阅读
- swiftui - ScrollViewReader 不工作,构建速度很慢
- mysql - 如何使用 sql 执行此操作
- javascript - 如何在滑块 wordpress 中获取幻灯片的数量/实际数量
- ios - SwiftUI iOS 14/15 无法点击 ScrollView 中 Spacer 下方的按钮
- flutter - 创建 Flutter 类和小部件时出现 null 安全错误
- json - NestJs - 如何在本地将对象下载为 json 文件?
- python - 尝试运行我的文件时出现 ModuleNotFoundError
- java - registerActivityForResult 从摄像头获取结果
- sql-server - 将 Spark Dataframe 写入 SQL Server 时如何指定列数据类型
- tensorflow - 既然 TensorflowJS 可以通过 WebGL 使用 GPU,我为什么需要 nVIDIA GPU?