gpt4 book ai didi

yii2 - 在 Yii2 中通过 Ajax 上传不包括文件

转载 作者:行者123 更新时间:2023-12-04 23:18:00 25 4
gpt4 key购买 nike

我正在尝试通过 Ajax 请求上传图像,但似乎遇到了与 this question 类似的问题但它没有答案。我不确定它们是否完全相同,因此我将在此处发布所有详细信息,并希望更多详细信息可以帮助人们找到答案。

我正在从我的代码中解释以下内容(删除了很​​多我认为与这个问题无关的内容),因此您看到的任何错别字都可能只是我更改了下面的代码。

以下内容包含在我的模型中:

use yii\web\UploadedFile;

...

class Image extends \yii\db\ActiveRecord
{
public $imageFile;

public function rules()
{
return [
[['imageFile'], 'file', 'skipOnEmpty' => true, 'extensions' => 'png, jpg'],
];
}

public function upload()
{
if ($this->validate()) {
$this->imageFile->saveAs('uploads/' . $this->imageFile->baseName . '.' . $this->imageFile->extension);
return true;
} else {
return false;
}
}

这是我的 View 文件的一部分:
<?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]) ?>
<?= $form->field($model, 'title') ?>
<?= $form->field($model, 'imageFile')->fileInput() ?>
<?= Html::submitButton('Upload', ['class' => 'btn btn-success']) ?>
<?php ActiveForm::end(); ?>

以及 View 中的 Ajax
$('form').on('beforeSubmit', function(e) {
var form = $(this);
$.post(form.attr('action'), form.serialize()).done(function(result) {
console.log(result)
});
return false; // Prevent default form submit action
});

以及我的 Controller 中的以下内容
use yii\web\UploadedFile;

...

public function actionUpload()
{
$model = new Image();

if (Yii::$app->request->isAjax) {
$model->load(Yii::$app->request->post());
$model->imageFile = UploadedFile::getInstance($model, 'imageFile');
if ($model->upload()) {
$model->save(); // To save the title to the database
Yii::$app->getSession()->addFlash('success', 'Image uploaded');
return $this->redirect(['index']);
}
}

Yii::$app->response->format = Response::FORMAT_JSON;
return ['return' => 'just me testing here'];
}

上面的 Ajax 只会将标题保存到数据库中,而不会上传文件。如果我将所有内容都转换为标准发布请求,我就可以让它全部工作(标题保存到数据库,图像上传到正确的目录)。如果我围绕各种 View 、模型和 Controller 进行调试,看起来我只是没有通过 Ajax 请求获取 imageFile。 $model->load(Yii::$app->request->post());加载通过 Ajax 提交的标题,那么为什么不拉文件呢?我想也许是 $model->imageFiles = UploadedFile::getInstances($model, 'imageFiles');将是提取 Ajax 提交文件的部分,但它似乎也没有得到我需要的东西。作为测试,我什至尝试将 imageFile 属性视为纯文本并将其分配给另一个要写入的数据库属性,并且效果很好。所以它似乎被正确地包含在模型中,只是没有与 Ajax 提交一起发送。

谁能告诉我,在 Yii2 中,我如何通过 Ajax 提交表单,包括选定的文件?

最佳答案

问题

ajax 的问题是 $_FILES详细信息不会在异步请求中发送。
当我们在没有ajax请求的情况下提交填写好的表单并在PHP后端调试时

echo '<pre>';
print_r($_FILES);
print_r($_POST);
echo '</pre>';
die;

然后我们成功得到 $_FILES$_POST数据。

但是当我们在ajax请求中调试同样的东西时,我们得到的只有 $_POST值,我们得到 $_FILESNULL .这使我们得出结论 $_FILES我们上面的代码不会在ajax请求中发送数据。

解决方案

我们需要使用 FormData JavaScript的。

它有什么作用?

简单来说就是把需要上传的文件的所有必要信息添加到 data参数在 $.ajax或填写 $_FILES以及所有 $_POST数据,即非文件输入,例如字符串编号等。

在您的 View 文件中
<?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]) ?>
<?= $form->field($model, 'title') ?>
<?= $form->field($model, 'imageFile')->fileInput() ?>
<button type="button" class="btn btn-success subm">Upload</button>
<?php ActiveForm::end(); ?>

<script>
$('.subm').click(function(e){
var formData = new FormData($('form')[0]);
console.log(formData);
$.ajax({
url: "some_php_file.php", //Server script to process data
type: 'POST',

// Form data
data: formData,

beforeSend: beforeSendHandler, // its a function which you have to define

success: function(response) {
console.log(response);
},

error: function(){
alert('ERROR at PHP side!!');
},


//Options to tell jQuery not to process data or worry about content-type.
cache: false,
contentType: false,
processData: false
});
});
</script>

测试

现在通过 print_r()在PHP代码中进行ajax请求和调试如上图,你会注意到 $_FILES不是 NULL 并且它包含所有文件(需要上传)数据。如果设置了,您可以使用 move_uploaded_file() 上传功能

这就是您的文件通过 Ajax 上传的方式。

Referece 1

Referece 2

Referece 3

关于yii2 - 在 Yii2 中通过 Ajax 上传不包括文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35438584/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com