今天写一个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>

Yii2表单提交(带文件上传)的更多相关文章

  1. jquery mobile 表单提交 图片/文件 上传

    jquerymobile 下面 form 表单提交 和普通html没区别,最主要是 <form 要加一个 data-ajax='false' 否则 上传会失败 1  html代码 <!do ...

  2. node07---post请求、表单提交、文件上传

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. ajax方式提交带文件上传的表单,上传后不跳转

    ajax方式提交带文件上传的表单 一般的表单都是通过ajax方式提交,所以碰到带文件上传的表单就比较麻烦.基本原理就是在页面增加一个隐藏iframe,然后通过ajax提交除文件之外的表单数据,在表单数 ...

  4. 【ASP.NET Web API教程】5.3 发送HTML表单数据:文件上传与多部分MIME

    原文:[ASP.NET Web API教程]5.3 发送HTML表单数据:文件上传与多部分MIME 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本系列教程,请先看前面 ...

  5. JavaScript实现form表单的多文件上传

    form表单的多文件上传,具体内容如下 formData对象可以使用一系列的键值对来模拟一个完整的表单,然后使用Ajax来发送这个表单 使用<form>表单初始化FormData对象的方式 ...

  6. [Nginx 2] form表单提交,图片上传

    导读:昨晚恶补了一些Nginx服务器的东西,从整体上对Nginx有一个初步的了解.上午去找师哥问了问目前项目中的使用情况,然后就开始上传图片了.这里就简单总结整理一下今天的成果,以后接着提升.简单粗暴 ...

  7. 基于hi-nginx的web开发(python篇)——表单处理和文件上传

    hi-nginx会自动处理表单,所以,在hi.py框架里,要做的就是直接使用这些数据. 表单数据一般用GET和POST方法提交.hi-nginx会把这些数据解析出来,放在form成员变量里.对pyth ...

  8. (27) java web的struts2框架的使用-基于表单的多文件上传

    和单个文件上传配置都是一样的,只是在action中接受参数时候,接受的是数组,不再是单个的文件. 一,action的实现: public class MutableFilesUpload extend ...

  9. 学习SpringMVC必知必会(7)~springmvc的数据校验、表单标签、文件上传和下载

    输入校验是 Web 开发任务之一,在 SpringMVC 中有两种方式可以实现,分别是使用 Spring 自带的验证 框架和使用 JSR 303 实现, 也称之为 spring-validator 和 ...

  10. (转)WebApi发送HTML表单数据:文件上传与多部分MIME

    5.3 Sending HTML Form Data5.3 发送HTML表单数据(2) 本文引自:http://www.cnblogs.com/r01cn/archive/2012/12/20/282 ...

随机推荐

  1. C算法分解质因数与分解因子

    ) ) printf("%d ",i); } }

  2. 03_Weblogic之配置简单域:启动和配置域,使用模板创建域,使用控制台

     1 域:概览 是Oracle Weblogic Server的基本管理单元 始终包含一个配置为管理服务器的Oracle WebLogic Server实例 域中可以包括一些称为受管服务器的Ora ...

  3. Chapter 2 User Authentication, Authorization, and Security(1):选择Windows和SQL 身份验证

    原文出处:http://blog.csdn.net/dba_huangzj/article/details/38657111,专题目录:http://blog.csdn.net/dba_huangzj ...

  4. 11.1、Libgdx的音频之音效

    (官网:www.libgdx.cn) 音效通常是比较小的音频文件,通常是几秒钟的长度.通常用在特定的游戏事件中,比如跳跃或者射击. 音效可以保存为多种格式.Libgdx支持MP3.OGG和WAV文件. ...

  5. java线程池ThreadPoolExecutor 如何与 AsyncTask() 组合使用

    简单说下Executors类,提供的一系列创建线程池的方法: 他们都有两个构造方法 1. --------newFixedThreadPool (创建一个定长线程池,可控制线程最大并发数,超出的线程会 ...

  6. Java 对象在堆中的内存结构

    翻译人员: 铁锚 翻译日期: 2013年11月8日 原文链接:  What do Java objects look like in memory during run-time? 我们知道,函数每次 ...

  7. javascript语法之声明变量

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. 菜鸟玩云计算之廿一: saltstack之pillar

    菜鸟玩云计算之廿一: saltstack之pillar 参考: 点击打开链接 查看pillar数据: # salt '*' pillar.items pillar的默认根目录在:/srv/pillar ...

  9. 集团公司(嵌入ETL工具)财务报表系统解决方案

    集团公司(嵌入ETL工具)财务报表系统解决方案 一.项目背景: 某集团公司是一家拥有100多家子公司的大型集团公司,旗下子公司涉及各行各业,包括:金矿.铜矿.房产.化纤等.由于子公司在业务上的差异,子 ...

  10. 使用Ext JS,不要使用页面做组件重用,尽量不要做页面跳转

    今天,有人请教我处理办法,问题是: 一个Grid,选择某条记录后,单击编辑后,弹出编辑窗口(带编辑表单),编辑完成后单击保存按钮保存表单,并关闭窗口,刷新Grid. 这,本来是很简单的,但囿于开发人员 ...