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> < ... 省略部分内容 ... >
解决方案
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请求。
- 去掉
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
相关产品推荐
相关产品推荐

