今天写一个php的表单提交接口,除了基本的字符串数据,还带文件上传,不用说前端form标签内应该有这些属性

<form  enctype="multipart/form-data" action="http://s6tr4y.natappfree.cc/basic/web/index.php?r=dao/upload"  target="frame1" method="post">

enctype:上面该属性值使得此表单可以上传文件;

action:地址指向后台DaoController.php类中的actionUpload()方法,方法体稍后贴出;

target:指向一个name值为frame1的空iframe标签,用来处理表单提交之后页面跳转的问题;

method:form表单提交数据的方式。

move_uploaded_file($_FILES["file"]["tmp_name"],"uploads/".$_FILES["file"]["name"]);

如上就是方法体内将文件转存到uploads目录下的代码,只有一行,但是注意了!!!

事实上,如果后台不作任何处理,这样在使用Yii2框架提交表单数据(包括文件)到controller,是会报400错误的(Bad Request (#400)---Unable to verify your data submission)。

然而如果将如上代码写到一个php文件内,例如:uploads.php文件

<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2018/4/9
* Time: 15:39
*/
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
echo $_FILES["file"]["name"];

然后form表单action到这个php文件(一个单纯的php文件,不依赖Yii2),是可以实现文件上传到uploads目录的,其实我刚开始也是这么做的,

但是在接收表单其他字符串数据的时候出现了这样那样的错误,例如我用\Yii::$app->request->post("id"),报错Yii类没有发现,但是我在controller

的方法里面直接这么写是不会报错的,哎,没办法,最后放弃这种方法(因为不是单纯的上传文件,还要获取文件的路径添加到数据库)

于是,选择采用r=dao/upload的方式来处理文件上传和表单数据获取,但是,这种方法可以获得数据,但在文件转存时会报错之前也提到了。

几经波折,找到了问题的所在:Yii2针对post提交的防csrf问题,没有csrftoken是提交不成功的。具体参考这篇博客:Yii2的csrf验证

该篇博客提到,方法有两种,这里我们选择粗暴一点的,直接禁用csrf验证。

<?php
namespace app\controllers;
use yii\web\Controller;
//解决ajax跨域问题设置的header
header('Access-Control-Allow-Origin:*');
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept"); class DaoController extends Controller{
//禁用Yii2的csrf验证
public $enableCsrfValidation = false;
//表单上传
public function actionUpload(){
//表单文件上传转存到uploads目录下
move_uploaded_file($_FILES["file"]["tmp_name"],"uploads/".$_FILES["file"]["name"]);
echo $_FILES["file"]["name"];
//随机数生成ID
$id = rand(,time());
//从表单拿数据
$name =\Yii::$app->request->post('name');
$tel =\Yii::$app->request->post('tel');
//拼接文件路径
$url ='http://s6tr4y.natappfree.cc/basic/web/uploads/'.$_FILES["file"]["name"];
//开启数据库连接
$conn = \Yii::$app->db;
//向数据库插入一条数据
$conn->createCommand()->insert('showshow', [
'id' => $id,
'name' => $name,
'tel'=> $tel,
'url'=> $url,
'number'=> '',
])->execute();
}
}

如此,便可以实现表单数据提交以及文件上传了,并且在后台实现将表单数据以及文件的存储路径作为一条记录存到数据库中了。

为了防止有人会觉得看的没头没脑的,这里贴上前端的form表单,至于数据库连接的配置我就不多说了,具体可参照博客:Yii2数据接口

<form class="T"  id="myForm" enctype="multipart/form-data" action="http://s6tr4y.natappfree.cc/basic/web/index.php?
r=dao/upload" target="frame1" method="post">
<div class="signForm">
<label>姓名:</label>
<input placeholder="请输入您的真实姓名" name="name" id="name"/>
</div>
<div class="signForm">
<label>手机:</label>
<input placeholder="请输入您的手机号" name="tel" id="tel"/>
</div>
<div class="signForm">
<label>产品:</label>
<input placeholder="请输入您购买的产品" name="pro" id="pro"/>
</div>
<input type="file" name="file" id="file"><br>
<input type="submit" name="submit" value="提交" id="btn" class="btn">
</form>
<iframe name="frame1" frameborder="" height=""></iframe>

最新文章

  1. win7下安装和使用Windows XP Mode
  2. 使用 UnrealPak.exe 创建 Pak文件方法
  3. Libevent 的多线程操作
  4. CF721C. Journey[DP DAG]
  5. [转]Android开发最佳实践
  6. linux入门学习1
  7. 微软Azure已开始支持hadoop--大数据云计算
  8. 核心ASP.NET
  9. Java EE (6) -- Java EE 5 Enterprise Architect Certified Master
  10. Cts分析框架(4)-添加任务
  11. Linux&#160;解决Linux下火狐浏览器中文乱码成方块显示问题
  12. CCF-学生排队
  13. Lights inside a 3d Grid UVA - 11605(概率)
  14. c++模板类成员的声明和定义
  15. 《LeetBook》leetcode题解(14):Longest Common Prefix[E]
  16. ArrayList和LinkedList源码分析
  17. 你必须了解Spring的生态
  18. Atitit.ALT+TAB没反应车and 点击任务栏程序闪烁但是不能切换
  19. jQuery select添加图标
  20. SQL数据库Replace的用法

热门文章

  1. Torch的安装和学习
  2. ROS_Kinetic_09 ROS基础内容(四)
  3. awk 详解+实例
  4. pig的limit无效(返回所有记录)sample有效
  5. Java-Iterator总结
  6. HBase写数据
  7. Android开发常用网站汇总
  8. C++容器学习,与结构体排序和set来一场邂逅
  9. javac编译同一个包内的java文件
  10. 软件开发顶尖高手的杀手锏SQL语句