Php Laravel$请求->;使用多部分/表单数据时,all()为空

Php Laravel$请求->;使用多部分/表单数据时,all()为空,php,angular,laravel,Php,Angular,Laravel,我发送的请求包括表单数据对象和一些数据,从angular 4到laravel api。。。有时请求数据接收正确,有时请求为空“空请求” 这是我的申请详情 Accept:application/json Accept-Encoding:gzip, deflate, br Accept-Language:en-US,en;q=0.9 Authorization:Bearer --------- Connection:keep-alive Content-Length:973 Content-Type

我发送的请求包括表单数据对象和一些数据,从angular 4到laravel api。。。有时请求数据接收正确,有时请求为空“空请求”

这是我的申请详情

Accept:application/json
Accept-Encoding:gzip, deflate, br
Accept-Language:en-US,en;q=0.9
Authorization:Bearer ---------
Connection:keep-alive
Content-Length:973
Content-Type:multipart/form-data; boundary=----WebKitFormBoundarydEkuATdI8JBFdnBM
Host:127.0.0.1:8000
Origin:http://localhost:4200
Referer:http://localhost:4200/shop_admin
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36
请求有效载荷

更新

这是我的密码

角边: 表单数据对象 这里是角形数据对象

let-formData:formData=new-formData();
formData.append('business_id',that.businessId);
formData.append('maintenance\u flag',that.maintenance\u flag);
formData.append('type',edit_type);
formData.append('name',name);
formData.append('website_uri',website);
formData.append('phone_number',phone);
append('facebook_link',face);
append('logo\u uri',that.basicData.logo\u uri);
formData.append('brands',即.selectedBrands);
如果(pic.files.length>0)

append('logo_uri',pic.files[0])您必须将CSRF令牌添加到请求中
Add:formData.append('_-token',{{csrf_-token()}})

1-除非您的路由不在web中间件下,否则您需要令牌
2-检查帖子大小,它可能大于允许的最大帖子大小…如果它更大,则必须在php.ini或.htaccess中或函数内部增加允许的最大帖子大小

我通过JavaScript在Axios中遇到此问题,因为内容类型标题是多部分表单数据,但缺少边界

根据我的研究,处理它的一个好方法是允许Axios自动检测内容类型并自行正确设置标题

以下是如何实现这一目标的想法:

const formDataWithFiles = hasFiles ? new FormData() : undefined;

if (formDataWithFiles) {
    // axios will automatically set the content-type to multipart/form-data if the
    // data param is a FormData object
    // otherwise, it will use application/json
    // (study the Dev Tools > Network tab > XHR tab headers)
    Object.keys(modifiedFields)
        .forEach(field => formDataWithFiles.append(field, modifiedFields[field]));
}

const { data } = await axios({
    method,
    url: actionUrl,
    data: hasFiles ? formDataWithFiles : modifiedFields,
    headers: {
        ...axios.defaults.headers,
        ...headers,
    },
});

return data;
上面的代码位于一个通用的handleSubmit函数中,可以从客户端的任何位置调用该函数

这是函数签名:

const { data } = await this.submitForm({
    actionUrl: this.actionUrl,
    method: this.method,
    modifiedFields: {
        ...this.modifiedUser,
    },
    hasFiles: true,
});
在上面的代码中,有两个用例。第一种是默认情况,通过平面对象发送正常有效负载。第二种情况是表单有文件,您需要
multipart/formdata
。在这种情况下,我们使用
FormData
对象作为容器来指示Axios自动检测必要的标题并设置正确的边界

如果未正确指定标头,则可能会在Laravel中接收空的
$request->all()
数组

我的答案的简短答案是使用
FormData
对象,因为它包含的信息比普通的老JavaScript对象更多。使用它,您还可以访问:

const formData = new FormData();

console.log('boundary:', formData._boundary);

正如我上面的注释所暗示的,使用开发工具>网络选项卡>XHR选项卡检查您的请求标题,并确保您的内容类型
应用程序/json
应用程序/x-www-form-urlencoded
用于常规表单提交和
多部分/表单数据'
(如果您正在上载文件)。

检查
文件上传
upload\u max\u filesize
post\u max\u size
指令在
php.ini

中,您应该这样使用:

$request->file('filename')

这是PHP的一个问题

除非请求方法为POST,否则它不会解析多部分表单数据:

解决方案:

有许多变通方法,没有一个是整洁的,但是:

  • 使用PATCH/PUT获得最佳实践,或者只是发布演示场景

  • 如果您不能切换方法,那么只需重新编写不使用Formdata的代码,PHP就会正确处理该文件

  • 使用POST和add发送方法:放置在formData上

  • (3) 像这样:


    你能给我们更多的信息吗。请添加您的代码,你已经尝试过什么了?你可以显示你的Laravel代码来显示这些值吗?如果你可以检查的话,我已经用代码更新了帖子it@MohamedMagdy你解决过这个问题吗?你是在发送csrf代币吗?我挠头已经有一个小时了-非常感谢你指出这个看似显而易见的想法-“让框架完成它的工作,并为你设置标题”我们都这么做。有时候,诀窍就是将你的头插入键盘几次。
    $request->file('filename')
    
    formData.append('_method', 'PUT')