我先说一下产品环境:
一个页面有功能1:上传文件 2:其他的个人信息。个人信息不是用input标签写的而是用其他标签写的比如p,span等,但是上传文件必须得用到form了。那就需要用formdata了。
formdata是一个对象,你先new出来,然后给他的里边添加你要的参数。把它作为一个整体用ajax的data传给后台。
//-----------------------------------------------前端思路
具体代码如下:
//弹窗上传
$("#but_shang").click(function(){
var formData = new FormData();
fileEl = document.getElementById("file");
var file = fileEl.files[0] // 可以获取到具体文件,多个文件可以通过files来判断
formData.append("file",file);
formData.append("s_id","2");
$.ajax({
type: "post",
url: "http://demo.te.bjdezd.com/index/oa/upload",
async:true,
contentType: false,
processData: false,
data: formData,
dataType: "json",
success: function (data) {
console.log(data)
}
});
})
如果你是自己写的ajax,再这里你可能会遇见一堆js的错误:illegal invocation 如下:
这个是你在ajax中少些了两个键值对,所以一定要加:
contentType: false,
processData: false,
//-------------------------------------------------------后端思路
这时候formdata就已经传输给后台了,后台想得到什么就按照获取值的方式拿就行(和往常的一样)。比如我用的 $_POST['name']; 得到名字。如果得到不了,而你确实传了这个name那你可以打印一下$_POST。
这时候你会发现打印的东西不是你常见的键值对,是一种乱七八糟的格式,那你很有可能没有给ajax中写:
contentType: false,
processData: false,
//-------------------------------------------------------数据库
因为我们的file的上传文件不是必传的,但是我们却把它在前端给add进去了。所以有两种情况:1.如果有文件那么可以用$file = request()->file('file');得到。 2.如果没有上传文件,那么file会作为一个字段,如果你下一步要存库,那就会报错了,提示你没有file这个字段,所以我们要看一下是否有file,有就把它保存到别的路径,没有就把它注销,代码如下:
$file = request()->file('file');
if(!empty($file)){
// 移动到框架应用根目录/public/uploads/ 目录下
$if = $file->move(ROOT_PATH . '/public/static/uploads/');
if($if){
$fileurl=$if->getSaveName();
$teacherArchives['fileurl']=$fileurl;
} else{
$teacherArchives['fileurl']="";
}
}else{
unset($teacherArchives['file']);
}