今天写一个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. ADFS3.0 Customizing the AD FS Sign-in Pages

    Windows Server2012R2自带的adfs是3.0的版本,不同于以前的版本的是3.0中登陆页面的定制化全部是通过powershell指令实现,官方的介绍链接如下:http://techne ...

  2. React Native调试心得

    在做React Native开发时,少不了的需要对React Native程序进行调试.调试程序是每一位开发者的基本功,高效的调试不仅能提高开发效率,也能降低Bug率.本文将向大家分享React Na ...

  3. go-mysql,一个易用的mysql接口框架实现

    介绍 go-mysql是一个用go写的mysql driver,使用接口类似于go自身的database sql,但是稍微有一点不同,现阶段还不支持集成进go database/sql中,但实现难度并 ...

  4. cas 单点登录(SSO)实验之二: cas-client

    cas 单点登录(SSO)实验之二: cas-client 参考文章: http://my.oschina.net/indestiny/blog/200768#comments http://wenk ...

  5. 【翻译】在Sencha Touch中创建离线/在线代理

    原文:Creating an Online/Offline proxy in Sencha Touch 概述 在Sencha Touch中,一个常见的需求就是,当设备在没有连接互联网的时候,应用程序必 ...

  6. 【一天一道LeetCode】#29. Divide Two Integers

    一天一道LeetCode系列 (一)题目 Divide two integers without using multiplication, division and mod operator. If ...

  7. Erlang 编写 Kafka 客户端之最简单入门

    Erlang 编写 Kafka 客户端之最简单入门 费劲周折,终于测通了 erlang 向kafka 发送消息,使用了ekaf 库,参考: An advanced but simple to use, ...

  8. Media Player Classic - HC 源代码分析 5:关于对话框 (CAboutDlg)

    ===================================================== Media Player Classic - HC 源代码分析系列文章列表: Media P ...

  9. /etc/fstab文件出错,无法进入Linux系统

    问题描述 今天复习Linux文件系统管理,在Linux系统上挂载了一块新硬盘之后,然后分区,格式化,一步步走下来,为了能够使该硬盘在系统启动时自动挂载,于是将之写入了/etc/fstab文件,然而在r ...

  10. SpriteBuilder中锚点的一般用法

    注意:改变节点的锚点(anchor point)将会影响缩放和旋转操作,也会影响边界边框和碰撞的检测. 锚点仅仅挪动节点的视觉表现,这种改变可能与物理表现不一致. 你绝不应该错误的挪动锚点去改变节点的 ...