formdata上传文件出现的种种错误

时间:2024-04-07 14:48:12

我先说一下产品环境:

        一个页面有功能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  如下:

formdata上传文件出现的种种错误

这个是你在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']);
            }