Php Laravel$请求->;使用多部分/表单数据时,all()为空
我发送的请求包括表单数据对象和一些数据,从angular 4到laravel api。。。有时请求数据接收正确,有时请求为空“空请求” 这是我的申请详情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
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')