提前摆上重要的事情
ajax 提交图片, PHP获取不到, 需要 file_get_contents(‘php://input’) 才能获取到
查了各种代码与论坛, 翻阅了Google, 都是再说 multipart/form-data 不支持
确实如果在Ajax提交的时候, 加上头部 'Content-Type': 'multipart/form-data'
后端需要通过 file_get_contents('php://input') 获取
解决方案
一定不要加上指定头部 ‘Content-Type’: ‘multipart/form-data’
JS代码中加上: contentType: false
================================ 以下是参考代码 ================================
JS代码
function upload() {
var formData = new FormData();
formData.append('image', $("#upimg")[0].files[0]); // 添加到请求体
formData.append('id', "37"); // 添加其它的参数
$.ajax({
type: "POST",
url: '/api/test',
dataType: 'json',
headers: {
'Authorization': token_type + ' ' + access_token // laravel的API登陆后的token
// , 'Content-Type': 'multipart/form-data' // 这里注释了 这里是最重要的地方, 博主在这里踩坑了!!!!
},
data: formData,
async: false,
cache: false,
contentType: false, // 注意这里, 默认值: true。默认情况下,通过data选项传递进来的数据,如果是一个对象(技术上讲只要不是字符串),都会处理转化成一个查询字符串,以配合默认内容类型 “application/x-www-form-urlencoded”。如果要发送 DOM 树信息或其它不希望转换的信息,请设置为 false。
processData: false, // 这里也一定要加, 默认为true,当设置为true的时候,jquery ajax 提交的时候不会序列化 data,而是直接使用data
beforeSend: function () {
// 自行处理
},
success: function (data) {
// 自行处理
},
complete: function () {
// 自行处理
},
error: function (err) {
// 自行处理
}
});
}
Laravel PHP后端代码
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class TestController extends Controller
{
public function go(Request $request)
{
// 这里博主就简单验证了下, 逻辑自行处理
return response()->json(request()->file("image")->isValid(), 200);
}
}