You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中PUT/PATCH方法无法获取form-data数据的解决求助

在Laravel中用PUT/PATCH方法获取form-data数据的解决方案

问题原因

Laravel默认仅对POST请求自动解析multipart/form-data格式的请求体,PUT/PATCH请求的form-data不会被框架自动解析,导致$request->all()返回空数组。

解决方案

方法一:用POST请求模拟PUT/PATCH(推荐)

这是Laravel官方适配的方案,既能满足请求方法的语义要求,又能完美解析form-data:

  1. 在Postman中选择请求方法为POST
  2. 在form-data中添加键为_method的字段,值设为PUT或PATCH
  3. 发送请求后,Laravel会识别为对应的PUT/PATCH请求,同时正常解析所有form-data参数和文件

控制器代码无需修改,继续使用原逻辑即可:

public function update(Request $request, string $id)
{
    $data = $request->all();
    dd($data);
}

方法二:自定义中间件解析PUT/PATCH的form-data

如果必须使用原生PUT/PATCH请求,可通过中间件手动解析请求体:

  1. 创建中间件文件app/Http/Middleware/ParsePutFormData.php:
<?php

namespace App\Http\Middleware;

use Closure;
use Symfony\Component\HttpFoundation\FileBag;
use Symfony\Component\HttpFoundation\ParameterBag;

class ParsePutFormData
{
    public function handle($request, Closure $next)
    {
        $isPutOrPatch = $request->isMethod('PUT') || $request->isMethod('PATCH');
        $isMultipart = str_contains($request->headers->get('Content-Type'), 'multipart/form-data');
        
        if ($isPutOrPatch && $isMultipart) {
            // 解析表单参数
            parse_str($request->getContent(), $formData);
            // 保留文件数据
            $files = $request->files->all();
            
            $request->request = new ParameterBag($formData);
            $request->files = new FileBag($files);
        }

        return $next($request);
    }
}
  1. 在app/Http/Kernel.php的$middleware数组中注册该中间件:
protected $middleware = [
    // ...其他中间件
    \App\Http\Middleware\ParsePutFormData::class,
];
  1. 之后使用原生PUT/PATCH请求发送form-data,控制器就能通过$request->all()获取完整数据。

方法三:控制器内手动解析(临时方案)

如果仅单个控制器需要处理,可直接在方法内手动解析请求体:

public function update(Request $request, string $id)
{
    $isPutOrPatch = $request->isMethod('PUT') || $request->isMethod('PATCH');
    $isMultipart = str_contains($request->headers->get('Content-Type'), 'multipart/form-data');
    
    if ($isPutOrPatch && $isMultipart) {
        $content = $request->getContent();
        $boundary = substr($content, 0, strpos($content, "\r\n"));
        $parts = array_slice(explode($boundary, $content), 1, -1);
        
        $data = [];
        foreach ($parts as $part) {
            if (preg_match('/name="([^"]+)"/', $part, $matches)) {
                $name = $matches[1];
                $value = trim(substr($part, strpos($part, "\r\n\r\n") + 4), "\r\n");
                $data[$name] = $value;
            }
        }
        // 合并文件数据
        $data = array_merge($data, $request->files->all());
    } else {
        $data = $request->all();
    }
    
    dd($data);
}

内容的提问来源于stack exchange,提问作者Selçuk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 06:53:13