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

2024-03-27

我正在尝试通过 Ajax 请求上传图像,似乎遇到了类似的问题这个问题 https://stackoverflow.com/questions/32055274/upload-ajax-file-in-yii2但它没有答案。我不确定它们是否完全相同,因此我将在此处发布我能找到的所有详细信息,并希望更多详细信息可以帮助某人找到答案。

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

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

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;
        }
    }

这是我的视图文件的一部分:

<?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(); ?>

以及视图中的 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
});

我的控制器中有以下内容

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 只会将标题保存到数据库中,而不会上传文件。如果我将所有内容转换为标准发布请求,我就可以使其全部正常工作(标题将保存到数据库,图像将上传到正确的目录)。如果我围绕各种视图、模型和控制器进行调试,看起来我只是没有通过 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 and $_POST data.

但是当我们在ajax请求中调试同样的事情时,我们只得到$_POST值,我们得到$_FILES as NULL。这使我们得出结论:$_FILES我们上面的代码没有在ajax请求中发送数据。

解决方案

我们需要使用FormData https://developer.mozilla.org/en/docs/Web/API/FormDataJavaScript 的。

它有什么作用?

简而言之,它添加了需要上传的文件的所有必要信息data参数输入$.ajax或填写$_FILES以及所有$_POST数据,即非文件输入,例如字符串、数字等。

在您的视图文件中

<?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>

Testing

现在发出 ajax 请求并在 PHP 代码中进行调试print_r()如上图所示,你会注意到$_FILES不为NULL,包含所有文件(需要上传)数据。如果已设置,您可以使用上传move_uploaded_file() funtion

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

参考文献1 https://stackoverflow.com/questions/21044798/how-to-use-formdata-for-ajax-file-upload

参考2 https://stackoverflow.com/questions/166221/how-can-i-upload-files-asynchronously

参考文献3 https://stackoverflow.com/questions/23980733/jquery-ajax-file-upload-php

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Yii2 中通过 Ajax 上传不包括文件 的相关文章

  • 如何进行字段枚举迁移 yii2

    我做了字段ENUM 当我使用时结果是错误的yii migrate up在 CMD 窗口上 public function up tableOptions null if this gt db gt driverName mysql tabl
  • 如何将 Yii 1.x 升级到 Yii 2.0?

    如何将 Yii 1 x 版本升级到 Yii 2 0 最新版本 我正在使用一个Ubuntu https en wikipedia org wiki Ubuntu 28operating system 29操作系统 将我的旧 Yii 更新到新
  • urlManager 在 Yii 2.0 中不工作

    我正在尝试学习 yii 2 0 目前我正在使用basicyii 2 0 版本 第一步是配置 url 所以根据指南 我启用了mod rewrite 使用检查它phpinfo 然后在中添加以下行components of config web
  • 如何在 Yii2 验证规则消息中添加换行符

    我需要打破 Yii2 验证规则中使用的长消息 我尝试这样 public function rules return username required message gt long message first line here br P
  • 如何在 yii2 的插入验证器上使用必需的?

    任何人都可以对如何使用提出建议 on gt insert 验证在yii2 我用过 array field name required on gt insert in Yii1 but in yii2它不会检查我是否设置 field name
  • 如何在没有模块的情况下动态设置错误处理程序的布局

    我是 Yii2 的新手 当我开始创建网站时 我发现您可以在配置中设置ErrorAction 如下所示 errorHandler gt errorAction gt site error 使用layout main php 中的布局时出现该错
  • 在 Yii 2.0.10 中防止多次点击和 ActiveForm 提交

    I use 活动表格 http www yiiframework com doc 2 0 yii bootstrap activeform html经常使用 并且发现它很方便 因为它包含客户端验证脚本yii js and yii activ
  • 设置 Yii2 预览

    Yii2 预览版最近发布 可在github https github com yiisoft yii2 我想对其进行试驾 但到目前为止 文档 几乎立即就过时了 因为它仍在大量开发中 我曾尝试遵循本指南 http www yiiframewo
  • Yii2:scenario()模型方法

    有2个需要的功能 注册时设置密码和如果用户忘记密码则更改密码 用户注册时 密码长度必须至少为4个字符 当更改通过时 至少 5 个字符 视图对于注册和更改通行证很常见 显然 还存在两种操作 其中使用 注册 或 更改 场景 模型中的代码片段 p
  • yii2 ActiveRecord 通过计算查找 OrderBy

    尝试从我的数据库中获取描述 查询返回结果 但我想将结果排序为仅显示得票最高的结果 投票数应按upvoted列减去downvoted column description UnitDescription find gt where id un
  • 无法获取以 Json 形式返回的 Yii2 对象数据

    我是 Yii2 框架和 PHP 的新手 当我尝试从服务器检索模型数据时json 我得到一个空结果 但是 当我使用var dump 我得到一个非空结果 控制器类代码 public function actionIndex client new
  • 对象配置必须是包含 yii2 和 mongodb 中“class”元素的数组

    登录或注册时出现错误 gt yii2 mongodb给出一个错误 MongoDB 与 yii2 的连接已完成 请帮我解决这个问题 main local php return components gt mongodb gt class gt
  • 如何以使用不同模型的形式实现kartik yii2 FileInput

    这是位于 myyiiapp backend views product form php 的代码 div class product form div
  • 在 Active Record 中使用 find() 和多个 where 子句

    我想将 Active Record 查询后的内容 使用括号 分为 3 组 第一组是从第一个 Where 子句到最后一个 orWhere 第二个和第三个将使用 andWhere 请给我关于如何使用括号分隔所有 3 个部分的建议 query B
  • 如何在 yii2 basic 中使用日期选择器?

    我想使用 yii2 datepicker 但我在实现它时遇到了麻烦 它不显示日期选择器 我不知道我的代码中缺少什么 我对这个yii还是个新手 div class row div class col lg 6 div class myproj
  • ActiveForm,用于字段损坏验证的自定义 ID

    我对 Yii2 还很陌生 并且遇到了下一个不愉快的问题 我在同一页面创建了两个表单 例如
  • Debian - /usr/bin/env: 'php\r': 没有这样的文件或目录

    所以当我跑步时 直接讨论问题 yii似乎我从 Debian stretch 中收到了从 Docker 运行的错误 然而当我跑步时 usr bin env php v我得到了正确的输出 没有问题 似乎新行被翻译为字符串时出现问题 我不知道如何
  • 关于 Yii2 RBAC 的疑惑

    到目前为止 我一直在使用 Yii 1 1 14 开发 Web 应用程序 但现在是时候进行升级了 我工作的公司开发了自己的访问控制系统 我对它真的很满意 直到我看到它到底是什么样子 数据库中8个表的组合 不包括用户表 还有一堆外键 1 个控制
  • 使用选项卡小部件将 ActiveForm 字段拆分为不同的选项卡

    我正在创建一个表单视图 我想使用官方选项卡小部件以选项卡结构组织表单字段 是否可以使用包含活动表单字段的 div 元素的 id 或类 来初始化选项卡小部件 如何管理它的一个示例如下 首先 将您的联系表单分为每个选项卡的一个视图文件 将 Ac
  • Yii2:ActiveController 中的 REST API 操作

    在文档指南中有示例 namespace app controllers use yii rest ActiveController class UserController extends ActiveController public m

随机推荐

  • Backbone 可以逆序渲染集合吗?

    我正在使用 Signalr 中心来订阅服务器上的事件 事件被分派到集线器 它成功地将项目添加到 Marionette CollectionView 这又被呈现到表格中 因为事件表本质上是一个记事本 所以我希望事件按相反的顺序排列 并且最好只
  • 成本计算器应用程序的设计模式?

    我有一个问题 我之前曾尝试寻求帮助 但当时无法解决它 所以我现在尝试简化问题 看看是否可以获得更具体的帮助 因为它让我发疯了 基本上 我有这个应用程序的工作 更复杂 版本 它是一个项目成本计算器 但因为我同时尝试学习更好地设计我的应用程序
  • iPhone 后台线程问题

    我正在使用后台线程来更新我的标签之一 我正在使用以下代码 但在 iOS 4 0 中 我了解到应用程序会保存其状态并进入后台 我的应用程序也做了这项工作 但是当我隐藏应用程序时 我正在使用的线程停止工作 并在我重新打开它时从我离开的位置恢复
  • IE8 支持哪些 Javascript 版本?

    根据维基百科 IE8仅支持Javascript 1 5 所以他们说 IE8 完全忽略了 Javascript 版本 1 6 1 7 1 8 和 1 9 我应该相信吗 这是真的吗 好吧 实际上 IE 的实现叫做JScript http msd
  • runBlock 发生后延迟 SKAction.sequence 中的下一个操作(Swift)?

    The duration财产为moveTo在 a 内时不被跟随runBlock 允许序列中的后续操作立即执行 而该操作应该只在之后执行duration秒 代码A 正确执行的序列 let realDest CGPointMake itemA
  • Ansible - 如何将 selectattr 与不同键的 yaml 一起使用

    我正在努力尝试做一件简单的事情 我认为这应该很容易 解析 yaml 并过滤 Ansible 中的某些键 我的 yaml 文件如下所示 vm vm1 ip 10 10 10 1 vm vm2 ip 10 10 10 2 test vm som
  • 清空表数据并重置 IDENTITY 列

    我在 SQL Server 中创建了一个包含几个表的数据库 我运行了一些测试 现在准备部署我的解决方案 问题是 表中有各种各样的数据 我想删除通过测试创建的所有表的每一行 并将主键放回到零 我尝试删除它不会重置主键索引 并且删除只是破坏了表
  • 如何使带有换行符的行内元素的背景延伸到每边最远的边缘?

    即使使用容器 我也不知道如何做到这一点 内联容器的背景将缩小到每行的大小 内联块容器将就像块元素一样 浮动似乎也不起作用 Example div style width 250px margin left 0px border 2px so
  • 如果在python中单独写一个变量名会发生什么?

    最近我开始好奇以下伪 python 代码的第 2 行发生了什么 def my fun foo bar foo return foo bar 我开始感兴趣的原因是我正在尝试 Light Table 并尝试在 foo 上放置一个手表 它似乎导致
  • C++ 将函数指针转换为唯一的“哈希”键

    Se 原始问题在底部 我想我明白你们现在在说什么 因为成员函数指针的内部结构是编译器 机器特定的 所以我实际上不可能做到这一点 因此 即使它在我测试时有效 我也不能保证它在其他编译器 机器上也有效 那么还有其他方法可以实现我想要的吗 我有一
  • tr1::reference_wrapper 有什么用?

    最近我读了斯科特 迈耶斯 Scott Meyers 的优秀著作有效的C https rads stackoverflow com amzn click com 0321334876书 在最后一篇技巧中 他介绍了 TR1 的一些功能 我通过
  • 如何通过代理 servlet 捕获服务器发送事件 (SSE)

    我们维护2个应用程序 application1在具有proxyservlet的glassfish服务器中运行 application2在同一台机器上与jetty服务器一起运行 我的 UI 代码发出请求 gt app1 proxyservle
  • SQLiteAssetHelper NullPointerException 仅在某些设备上

    我正在使用 SQLiteAssetHelper 库来处理我的 App DB 操作 它对于我测试过的几乎所有手机都运行良好 然而 一些使用 Android 2 3 3 2 3 7 的用户报告在调用打开数据库时崩溃 我怀疑这是由于第一次从资产文
  • 添加类以在 Laravel 上选择元素

    我有这个问题 我找不到在此下拉框中添加类属性的方法 Form select bancada Bancada lists nombre idBancada 我尝试过各种语法 但无法让它工作 有什么建议么 谢谢 使用第四个参数向元素添加属性 F
  • 类继承方面的协变与逆变

    协变 和 逆变 概念的含义是什么 给定2个班级 Animal and Elephant 继承自Animal 我的理解是 如果您尝试将大象放入动物数组中 则会出现运行时错误 而发生这种情况是因为大象比动物 更大 更具体 但是您能否将一个 An
  • Contenteditable Div - 以 innerHTML 位置表示的光标位置

    我已经完成了我的研究 并在 StackOverflow 上遇到了这些问题 人们问了同样的问题 但问题是他们想要根据 x 和 y 坐标或左侧的列来获取位置 我想知道光标相对于 div 的innerHTML 的位置 例如 innerHTML T
  • 通过javascript让photoshop运行系统命令

    我有一行代码如下 app system cmd exe python D project PStest py 这是从 Photoshop 中运行 python 脚本 这里已经提出了类似的问题 我也遵循了同样的问题使用 Photoshop J
  • 在函数内使用 lambda

    我正在通过在线教程学习 Python 中的 lambda 函数 我理解它是如何工作的 但我遇到了一个让我困惑的例子 关于这一页 https www w3schools com python python lambda asp def myf
  • spring.http.multipart.enabled 与 spring.servlet.multipart.enabled 到底有何不同?

    在 Spring Boot 中 对于分段上传 我看到许多教程网站建议具有以下属性之一 spring http multipart enabled false or spring servlet multipart enabled true
  • 在 Yii2 中通过 Ajax 上传不包括文件

    我正在尝试通过 Ajax 请求上传图像 似乎遇到了类似的问题这个问题 https stackoverflow com questions 32055274 upload ajax file in yii2但它没有答案 我不确定它们是否完全相