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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 09:13:13