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包)时失败。
具体修复步骤
使用上传后的实际文件路径导入
你已经将文件移动到../uploads/$unique_name,直接用这个路径传给Excel::import即可:// 替换原有的Excel::import(new ImportClaims, $filenames); Excel::import(new ImportClaims, $path);这里的
$path就是你代码中已经定义好的../uploads/. $unique_name。可选:直接使用请求中的文件对象(无需手动移动)
如果你不需要手动将文件存储到uploads目录,可以直接使用请求中的文件对象,让Laravel Excel自动处理临时文件,更简洁且避免路径错误:Excel::import(new ImportClaims, $request->file('file_name'));额外优化建议
- 不要使用相对路径
../uploads,改用Laravel官方存储路径,比如storage_path('app/uploads'),避免不同环境下的路径解析问题; - 确保
storage/framework/cache/laravel-excel目录有读写权限,Laravel Excel会在此缓存解析后的文件。
- 不要使用相对路径
内容的提问来源于stack exchange,提问作者Sathish S
相关产品推荐
相关产品推荐

