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

Laravel上传文件提取失败问题排查求助

Laravel 文件上传问题排查

根据Laravel官方文档编写的文件检测代码如下:

<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

Route::get('/', function (Request $request) {
    if ($request->hasFile('source')) { return ">> GOOD ! <<"; }
    if ($request->hasFile('input.json')) { return ">> GOOD ! <<"; }

    $x = count($_FILES);

    return "DD >> $x << DD";
});

问题1:GET请求上传文件时$_FILES为空

使用curl发送GET请求上传文件,返回结果显示$_FILES计数为0:

$ curl.exe -X GET -F "source=@input.json" http://127.0.0.1:8008/
DD >> 0 << DD

问题2:改为POST请求后出现页面过期提示

将路由改为Route::post(...)后,发送POST请求返回"页面过期"提示:

$ curl.exe -X POST -F "source=@input.json" http://127.0.0.1:8008/
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        <title>Page Expired</title>
< ... 省略部分内容 ... >

解决方案

  1. GET请求不支持文件上传
    HTTP规范中GET请求没有请求体,无法携带文件。curl的-F参数默认会发送POST请求,但你指定了-X GET强制使用GET方法,导致请求格式冲突,服务器无法解析文件。解决方法:

    • 去掉-X GET参数,让curl自动使用POST方法:
      curl.exe -F "source=@input.json" http://127.0.0.1:8008/
      
    • 或者使用POST路由配合正确的POST请求。
  2. POST请求的CSRF验证问题
    Laravel默认对所有POST/PUT/DELETE请求开启CSRF保护,未携带CSRF令牌会触发"页面过期"错误。解决方法:

    • 测试场景:在app/Http/Middleware/VerifyCsrfToken.php的$except数组中添加该路由,临时跳过CSRF验证:
      protected $except = [
          '/',
      ];
      
    • 生产场景:如果是API接口,推荐使用Laravel Passport或Sanctum做身份验证;若是页面请求,需在请求中携带从页面meta标签获取的CSRF令牌。

内容的提问来源于stack exchange,提问作者OrenIshShalom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 16:12:50