服务端代码

/**
* 文件上传
*/
public function uploadFile()
{
Log::error('文件上传 : '.json_encode($_FILES));
$dir = $this->request->post('type', 'file');
$file = $this->request->file('avatar');
if (!empty($file)) {
$info = $file->validate(['size' => 20480, 'ext' => 'jpg,png,gif,pfx,cer'])->move(Env::get('root_path') . 'public/upload/' . $dir);
if ($info) {
$file_path = str_replace("\\", "/", '/upload/' . $dir . '/' . $info->getSaveName());
return response_json(0, '上传成功',['url' => $file_path]);
} else {
return response_json(1, $file->getError());
}
} else {
return response_json(1, '未选择文件');
}
}

前端页面

<span class="img_upload">点击我上传</span>

<input type="file" class="avatar" style="display: none;">
<script type="text/javascript" src="/assets/common/js/jquery.min.js"></script>
<script type="application/javascript">
// 上传图片
$('.img_upload').click(function() {
$('.avatar').click();
}); $('.avatar').change(function() {
// 获取上传文件,拿到type为file的input的具体文件,由于可能存在多选择文件问题,所以这里是[0]取第一个。
var _avatar = $('.avatar')[0]['files'][0];
var _fromData = new FormData();
_fromData.append('username', 'Tinywan');
_fromData.append('age', 24);
_fromData.append('avatar', _avatar); $.ajax({
url: "{:url('/index/Test/uploadFile')}",
type: "POST",
cache: false,
data: _fromData,
dataType: "JSON",
processData: false, // 设置 processData 选项为 false,防止自动转换数据格式。
contentType: false, // 告诉jquery不要设置content-Type请求头
success: function(data) {
// 上传成功后,清空当前文件,继续点击上传单个文件。否则不能继续点击上传
$('.avatar').val("");
console.log(data);
},
error: function(data) {
console.log(data);
}
});
});
</script>

1、全局文件数组接受参数:$_FILES

{
"avatar": {
"name": "2.png",
"type": "image/png",
"tmp_name": "/tmp/phppFGojm",
"error": 0,
"size": 11965
}
}

以上接受的参数是通过添加文件

var _avatar = $('.avatar')[0]['files'][0];
_fromData.append('avatar', _avatar);  

服务端接受

$file = $this->request->file('avatar');  

说明:这里传递的二进制文件名称必须和服务端接受的名称同名。其他数据可以通过POST方式接受:$post = $this->request->post();  

2、增加第三个参数

_fromData.append('avatar', _avatar,'tinywan.png'); 

语法:formData.append(name, value, filename); 传给服务器的文件名称 (一个 USVString), 当一个 Blob 或 File 被作为第二个参数的时候, Blob 对象的默认文件名是 "blob"。 File 对象的默认文件名是该文件的名称。更多:https://developer.mozilla.org/zh-CN/docs/Web/API/FormData/append

服务端接受参数

{
"avatar": {
"name": "tinywan.png", // 重点在这里
"type": "image/png",
"tmp_name": "/tmp/phpponpkP",
"error": 0,
"size": 11965
}
}

参考

1、https://developer.mozilla.org/zh-CN/docs/Web/API/FormData

2、https://www.cnblogs.com/lyr1213/p/6238026.html  

工具系列 | 使用FormData方式上传文件的更多相关文章

  1. formdata方式上传文件,支持大文件分割上传

    1.upload.html <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/html"> <h ...

  2. C# HTTP系列13 以form-data方式上传多个文件以及键值对集合到远程服务器

    系列目录     [已更新最新开发文章,点击查看详细] 类似于以下场景,将表单中的用户信息(包含附件)上传到服务器并保存到数据库中, <form id="form1" run ...

  3. 通过Ajax方式上传文件,使用FormData进行Ajax请求

    通过传统的form表单提交的方式上传文件: <form id= "uploadForm" action= "http://localhost:8080/cfJAX_ ...

  4. IT轮子系列(四)——使用Jquery+formdata对象 上传 文件

    前言 在MVC 中文件的上传,一般都采用控件: <h2>IT轮子四——文件上传</h2> <div> <input type="file" ...

  5. koa2:通过Ajax方式上传文件,使用FormData进行Ajax请求

    koa2通过表单上传的网上很多,但通过Ajax方式上传文件,使用FormData进行Ajax请求,不好找. 参考了这个用base64上传图片的例子.https://github.com/Yuki-Mi ...

  6. [转] 通过Ajax方式上传文件,使用FormData进行Ajax请求

    通过传统的form表单提交的方式上传文件: <form id= "uploadForm" action= "http://localhost:8080/cfJAX_ ...

  7. Ajax方式上传文件

    用到两个对象 第一个对象:FormData 第二个对象:XMLHttpRequest 目前新版的Firefox 与 Chrome 等支持HTML5的浏览器完美的支持这两个对象,但IE9尚未支持 For ...

  8. 通过jQuery Ajax使用FormData对象上传文件

    FormData对象,是可以使用一系列的键值对来模拟一个完整的表单,然后使用XMLHttpRequest发送这个"表单". 在 Mozilla Developer 网站 使用For ...

  9. 前端 - jquery方式 / iframe +form 方式 上传文件

    环境与上一章一样 jquery 方式上传文件: HTML代码 {#html代码开始#} <input type="file" id="img" > ...

随机推荐

  1. 搭建前端监控系统(五)Nodejs怎么搭建消息队列

    怎样定位前端线上问题,一直以来,都是很头疼的问题,因为它发生于用户的一系列操作之后.错误的原因可能源于机型,网络环境,接口请求,复杂的操作行为等等,在我们想要去解决的时候很难复现出来,自然也就无法解决 ...

  2. 关于c3p0的重连机制(转载)

    1)C3P0容错和自动重连与以下配置参数有关: breakAfterAcquireFailure :true表示pool向数据库请求连接失败后标记整个pool为block并close,就算后端数据库恢 ...

  3. js定时器的应用

    定时器分为两种 一种是一次性的,时间到就执行 var timer=setTimeout(fun,毫秒数); 清除的方法 clearTimeout(timer) 第二种是周期性的,根据设定的时间周期进行 ...

  4. Linux Swap故障之 swapoff failed: Cannot allocate memory

    目录swap分区关闭方法1:释放内存缓存方法2:允许内存overcommit swap分区关闭准备调整Linux下的swap分区的使用率.在Linux下执行 swapoff -a -v报如下错误:sw ...

  5. SpringCloud2.0 Hystrix Dashboard 断路器指标看板

    原文:https://www.cnblogs.com/songlu/p/9973856.html 1.启动基础工程 1.1.启动[服务中心]集群,工程名称:springcloud-eureka-ser ...

  6. 【 BowWow and the Timetable CodeForces - 1204A 】【思维】

    题目链接 可以发现 十进制4 对应 二进制100 十进制16 对应 二进制10000 十进制64 对应 二进制1000000 可以发现每多两个零,4的次幂就增加1. 用string读入题目给定的二进制 ...

  7. Excel——读取——导出目录

    /** * 导出Excel文件到具体的目录 * <一句话功能简述> * <功能详细描述> * @param fileName 导出的文件名 * @param sheetName ...

  8. 修改mysql 8.0.16 root 密码--mac

    https://blog.csdn.net/HECTOR_1368391900/article/details/90732097 https://my.oschina.net/u/3251146/bl ...

  9. MD5加密封装

    1.固定返回固定长度字符串(16位或者32位) /// <summary> /// 用MD5加密字符串,可选择生成16位或者32位的加密字符串 /// </summary> / ...

  10. mysql和sqliet连接

    Python里Django框架数据库要配置1.setting已经自己配置好2.需要自己连接.找到setting里DATABASES进行连接自己数据库MySQL数据库连接 model里创建数据表就是Dj ...