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

Laravel10调用API导入Maatwebsite/Excel3.1 xlsx文件报错求助

Laravel 10 + Maatwebsite/Excel 3.1 API导入XLSX文件报错修复方案

问题场景

在Laravel 10项目中使用Maatwebsite/Excel 3.1版本导入XLSX文件时,表单提交可正常运行,但调用API时出现以下错误:

Exception: Could not find zip member zip://D:\resolv_new\resolv_v2\backend\storage\framework\cache\laravel-excel\laravel-excel-1vH2iciofDVglNHgp5Ty4T93ZFQZEQjr.xlsx#_rels\.rels in file D:\resolv_new\resolv_v2\backend\app\Http\Controllers\ImportController.php on line 89

#0 D:\resolv_new\resolv_v2\backend\vendor\laravel\framework\src\Illuminate\Routing\Controller.php(54): App\Http\Controllers\ImportController->upload(Object(Illuminate\Http\Request))
#1 D:\resolv_new\resolv_v2\backend\vendor\laravel\framework\src\Illuminate\Routing\ControllerDispatcher.php(43): Illuminate\Routing\Controller->callAction('upload', Array)
#2 D:\resolv_new\resolv_v2\backend\vendor\laravel\framework\src\Illuminate\Routing\Route.php(259): Illuminate\Routing\ControllerDispatcher->dispatch(Object(Illuminate\Routing\Route), Object(App\Http\Controllers\ImportController), 'upload')
#3 D:\resolv_new\resolv_v2\backend\vendor\laravel\framework\src\Illuminate\Routing\Route.php(205): Illuminate\Routing\Route->runController()
#4 D:\resolv_new\resolv_v2\backend\vendor\laravel\framework\src\Illuminate\Routing\Router.php(799): Illuminate\Routing\Route->run()
#5 D:\resolv_new\resolv_v2\backend\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(141): Illuminate\Routing\Router->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#6 D:\resolv_new\resolv_v2\backend\app\Http\Middleware\SessionHandler.php(27): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#7 D:\resolv_new\resolv_v2\backend\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(180): App\Http\Middleware\SessionHandler->handle(Object(Illuminate\Http\Request), Object(Closure))
#8 D:\resolv_new\resolv_v2\backend\vendor\laravel\framework\src\Illuminate\Routing\Middleware\SubstituteBindings.php(50): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#9 D:\resolv_new\resolv_v2\backend\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(180): Illuminate\Routing\Middleware\SubstituteBindings->handle(Object(Illuminate\Http\Request), Object(Closure))
#10 D:\resolv_new\resolv_v2\backend\vendor\laravel\framework\src\Illuminate\Routing\Middleware\ThrottleRequests.php(159): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#11 D:\resolv_new\resolv_v2\backend\vendor\laravel\framework\src\Illuminate\Routing\Middleware\ThrottleRequests.php(125): Illuminate\Routing\Middleware\ThrottleRequests->handleRequest(Object(Illuminate\Http\Request), Object(Closure), Array)
#12 D:\resolv_new\resolv_v2\backend\vendor\laravel\framework\src\Illuminate\Routing\Middleware\ThrottleRequests.php(87): Illuminate\Routing\Middleware\ThrottleRequests->handleRequestUsingNamedLimiter(Object(Illuminate\Http\Request), Object(Closure), 'api', Object(Closure))
#13 D:\resolv_new\resolv_v2\backend\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(180): Illuminate\Routing\Middleware\ThrottleRequests->handle(Object(Illuminate\Http\Request), Object(Closure), 'api')
#14 D:\resolv_new\resolv_v2\backend\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(116): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#15 D:\resolv_new\resolv_v2\backend\vendor\laravel\framework\src\Illuminate\Routing\Router.php(798): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#16 D:\resolv_new\resolv_v2\backend\vendor\laravel\framework\src\Illuminate\Routing\Router.php(777): Illuminate\Routing\Router->runRouteWithinStack(Object(Illuminate\Routing\Route), Object(Illuminate\Http\Request))
#17 D:\resolv_new\resolv_v2\backend\vendor\laravel\framework\src\Illuminate\Routing\Router.php(741): Illuminate\Routing\Router->runRoute(Object(Illuminate\Http\Request), Object(Illuminate\Routing\Route))
#18 D:\resolv_new\resolv_v2\backend\vendor\laravel\framework\src\Illuminate\Routing\Router.php(730): Illuminate\Routing\Router->dispatchToRoute(Object(Illuminate\Http\Request))
#19 D:\resolv_new\resolv_v2\backend\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(200): Illuminate\Routing\Router->dispatch(Object(Illuminate\Http\Request))
#20 D:\resolv_new\resolv_v2\backend\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(141): Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}(Object(Illuminate\Http\Request))
#21 D:\resolv_new\resolv_v2\backend\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#22 D:\resolv_new\resolv_v2\backend\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull.php(31): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle(Object(Illuminate\Http\Request), Object(Closure))
#23 D:\resolv_new\resolv_v2\backend\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(180): Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull->handle(Object(Illuminate\Http\Request), Object(Closure))
#24 D:\resolv_new\resolv_v2\backend\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#25 D:\resolv_new\resolv_v2\backend\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\TrimStrings.php(40): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle(Object(Illuminate\Http\Request), Object(Closure))
#26 D:\resolv_new\resolv_v2\backend\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(180): Illuminate\Foundation\Http\Middleware\TrimStrings->handle(Object(Illuminate\Http\Request), Object(Closure))
#27 D:\resolv_new\resolv_v2\backend\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\ValidatePostSize.php(27): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#28 D:\resolv_new\resolv_v2\backend\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(180): Illuminate\Foundation\Http\Middleware\ValidatePostSize->handle(Object(Illuminate\Http\Request), Object(Closure))
#29 D:\resolv_new\resolv_v2\backend\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance.php(86): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#30 D:\resolv_new\resolv_v2\backend\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(180): Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance->handle(Object(Illuminate\Http\Request), Object(Closure))
#31 D:\resolv_new\resolv_v2\backend\vendor\laravel\framework\src\Illuminate\Http\Middleware\HandleCors.php(62): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#32 D:\resolv_new\resolv_v2\backend\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(180): Illuminate\Http\Middleware\HandleCors->handle(Object(Illuminate\Http\Request), Object(Closure))
#33 D:\resolv_new\resolv_v2\backend\vendor\laravel\framework\src\Illuminate\Http\Middleware\TrustProxies.php(39): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#34 D:\resolv_new\resolv_v2\backend\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(180): Illuminate\Http\Middleware\TrustProxies->handle(Object(Illuminate\Http\Request), Object(Closure))
#35 D:\resolv_new\resolv_v2\backend\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(116): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#36 D:\resolv_new\resolv_v2\backend\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(175): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#37 D:\resolv_new\resolv_v2\backend\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(144): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter(Object(Illuminate\Http\Request))
#38 D:\resolv_new\resolv_v2\backend\public\index.php(51): Illuminate\Foundation\Http\Kernel->handle(Object(Illuminate\Http\Request))

控制器代码

/*Upload Claim CSV file and Upload Data into DB*/
public function upload(Request $request)
{
    try {
        $practice_dbid = $request->get('practice_dbid');
        $savedata = $request->file('file_name');
        $filenames = $request->file('file_name')->getClientOriginalName();
        $user = $request->get('user_id');
        $unique_name = md5($filenames . time());
        $filename = date('Y-m-d') . '_' . $filenames;
        $path = "../uploads";
        $savedata->move($path, $unique_name);
        $path = "../uploads/" . $unique_name;
        $report_date = $request->get('report_date');
        $notes = $request->get('notes');


        Excel::import(new ImportClaims, $filenames);
        // Excel::import(new ImportClaims, $request->file('file_name')->store('files'));

        // Excel::import($importClaims, $filenames);
        Log::info('upload checking');
        // Log::debug(print_r($importClaims, true));

        return response()->json([
            // 'message' =>  $importClaims,
            'upload_msg'  => "Upload Complete"
        ]);
    } catch (Exception $e) {
        Log::debug($e->getMessage() . $e->getLine());
        throw new Exception($e->getMessage());
    }
}

修复方案

核心问题分析

报错提示找不到ZIP成员#_rels\.rels,本质原因是:你调用Excel::import时传入的是原始文件名$filenames,而非上传后实际存储的文件路径或文件对象。表单提交时临时文件路径恰好和原始文件名匹配,侥幸正常运行;但API调用时,文件上传后的存储路径和原始文件名不对应,导致Excel组件无法找到正确文件,解析XLSX(本质是ZIP包)时失败。

具体修复步骤

  1. 使用上传后的实际文件路径导入
    你已经将文件移动到../uploads/$unique_name,直接用这个路径传给Excel::import即可:

    // 替换原有的Excel::import(new ImportClaims, $filenames);
    Excel::import(new ImportClaims, $path);
    

    这里的$path就是你代码中已经定义好的../uploads/ . $unique_name。

  2. 可选:直接使用请求中的文件对象(无需手动移动)
    如果你不需要手动将文件存储到uploads目录,可以直接使用请求中的文件对象,让Laravel Excel自动处理临时文件,更简洁且避免路径错误:

    Excel::import(new ImportClaims, $request->file('file_name'));
    
  3. 额外优化建议

    • 不要使用相对路径../uploads,改用Laravel官方存储路径,比如storage_path('app/uploads'),避免不同环境下的路径解析问题;
    • 确保storage/framework/cache/laravel-excel目录有读写权限,Laravel Excel会在此缓存解析后的文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 19:54:57