Laravel中AJAX上传CSV遇400错误:如何正确上传并读取?
如何通过AJAX将CSV文件正确发送到Laravel控制器并读取?
现有代码
前端JavaScript代码
$('#send-csv').click(function(){ var CSRF_TOKEN = document.querySelector('meta[name="csrf-token"]').getAttribute("content"); var files = $('#csv-file')[0].files; console.log(files); if(files.length > 0){ var fd = new FormData(); fd.append('file', files[0]); fd.append('_token', CSRF_TOKEN); $.ajax({ url: "{{ route('api.send-csv') }}", method: 'post', data: fd, contentType: false, processData: false, dataType: 'json', success: function(response){ alert("send"); console.log(response); }, error: function(response){ console.log("error : " + JSON.stringify(response) ); } }); }else{ alert("Please select a file."); } });
HTML代码
<div class="col-12 mt-3"> <input type="file" class="btn btn-light" id="csv-file"> </div> <div class="col-12 mt-2"> <span class="btn btn-primary" id="send-csv">Wyślij plik CSV</span> </div>
Laravel控制器代码
public function readCSV(Request $request) { return 'test'; }
遇到的问题
Laravel后端始终返回400错误:Wrong input. Some domains are invalid,但控制器方法仅返回字符串,未添加任何验证或业务逻辑。
解决步骤
1. 排查路由与CSRF验证
- 确认
api.send-csv路由配置正确,检查routes/api.php(若使用web路由则检查routes/web.php):// api路由示例(无需CSRF验证) Route::post('/send-csv', [YourController::class, 'readCSV'])->name('api.send-csv'); - 若使用
api路由组,Laravel默认不启用CSRF验证,可移除JS中fd.append('_token', CSRF_TOKEN);这一行;若使用web路由,确保页面头部存在正确的CSRF meta标签。
2. 修正AJAX数据类型匹配
控制器返回的是纯字符串'test',但AJAX设置了dataType: 'json',会导致JSON解析失败触发错误。两种修正方式:
- 修改控制器返回JSON格式:
public function readCSV(Request $request) { return response()->json(['message' => 'test']); } - 或修改AJAX的
dataType为'text',直接接收字符串响应。
3. 正确读取上传的CSV文件
在控制器中添加文件验证与读取逻辑:
use Illuminate\Http\Request; public function readCSV(Request $request) { // 验证上传文件 $request->validate([ 'file' => 'required|file|mimes:csv,txt', // 限制文件类型为CSV或文本 ]); // 获取上传的文件对象 $csvFile = $request->file('file'); // 方式1:直接读取文件内容 $csvContent = file_get_contents($csvFile->getRealPath()); // 可按行分割处理 $rows = explode(PHP_EOL, $csvContent); // 方式2:用SplFileObject逐行读取CSV(更规范) $csv = new \SplFileObject($csvFile->getRealPath()); $csv->setFlags(\SplFileObject::READ_CSV | \SplFileObject::SKIP_EMPTY); foreach ($csv as $index => $row) { if ($index === 0) continue; // 跳过表头(可选) // 处理每行数据,比如$row[0]是第一列值 // dd($row); } return response()->json([ 'success' => true, 'message' => 'CSV文件读取成功', 'row_count' => count($rows) - 1 // 减去表头行(可选) ]); }
4. 定位400错误来源
错误提示Wrong input. Some domains are invalid并非Laravel默认错误,需排查:
- 检查全局中间件列表(
app/Http/Kernel.php),是否存在验证域名的自定义中间件; - 检查项目中是否引入了第三方包(如域名白名单验证类),是否对该路由生效;
- 查看
.env文件是否有类似ALLOWED_DOMAINS的配置项,确认当前请求域名在列表内。
内容的提问来源于stack exchange,提问作者Sdsdsd
相关产品推荐
相关产品推荐

