{"record":{"id":"48659da51a77a762","repo":"karatelabs/karate","slug":"multipart-files-entry-requires-name","errorCode":null,"errorMessage":"multipart files entry requires 'name': ","messagePattern":"multipart files entry requires 'name': ","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"karate-core/src/main/java/io/karatelabs/core/StepExecutor.java","lineNumber":2556,"sourceCode":"            Map<String, Object> filesMap = (Map<String, Object>) value;\n            for (Map.Entry<String, Object> entry : filesMap.entrySet()) {\n                processMultipartFileEntry(entry.getValue(), entry.getKey());\n            }\n        } else {\n            throw new RuntimeException(\"multipart files expects a list or map: \" + step.getText());\n        }\n    }\n\n    private void processMultipartFileEntry(Object item, String defaultName) {\n        if (item instanceof Map) {\n            @SuppressWarnings(\"unchecked\")\n            Map<String, Object> fileMap = (Map<String, Object>) item;\n            Map<String, Object> multipartMap = new HashMap<>();\n\n            // Name from map entry key (V1 compat) or from 'name' property\n            String name = defaultName != null ? defaultName : (String) fileMap.get(\"name\");\n            if (name == null) {\n                throw new RuntimeException(\"multipart files entry requires 'name': \" + item);\n            }\n            multipartMap.put(\"name\", name);\n\n            // Handle file read\n            Object readPath = fileMap.get(\"read\");\n            if (readPath != null) {\n                Resource resource = resolveResource(readPath.toString());\n                File file = getFileFromResource(resource);\n                if (file != null) {\n                    multipartMap.put(\"value\", file);\n                } else {\n                    try (InputStream is = resource.getStream()) {\n                        byte[] bytes = is.readAllBytes();\n                        multipartMap.put(\"value\", bytes);\n                    } catch (Exception e) {\n                        throw new RuntimeException(\"failed to read file: \" + readPath, e);\n                    }\n                }","sourceCodeStart":2538,"sourceCodeEnd":2574,"githubUrl":"https://github.com/karatelabs/karate/blob/a22eb90246d958d15a47bf436693d0121ad2812d/karate-core/src/main/java/io/karatelabs/core/StepExecutor.java#L2538-L2574","documentation":"Each entry in a `multipart files` list/map must identify its part name — either as the map-entry key (V1 style) or a `name` property in the entry object. When a list entry lacks both, StepExecutor throws this RuntimeException showing the offending entry.","triggerScenarios":"`multipart files [{ read: 'file.txt' }, ...]` — list items without a `name` property and no default name from a map key.","commonSituations":"Converting from V1 map syntax to list syntax and dropping the `name` key; assuming the filename inside `read` implies the part name; programmatically generated entries missing the field.","solutions":["Add `name` to each entry: `{ name: 'myFile', read: 'file.txt' }`.","Or use the V1 map form where the key is the name: `{ myFile: { read: 'file.txt' } }`.","Validate generated entries include `name` before invoking the step.","Include `filename` too if the server expects an original filename."],"exampleFix":"// before\nAnd multipart files [{ read: 'data/a.txt' }]\n// after\nAnd multipart files [{ name: 'uploadA', read: 'data/a.txt', filename: 'a.txt' }]","handlingStrategy":"validation","validationCode":"// Validate every entry has a name before the step\n* def entries = [{ read: 'a.txt' }]\n* def ok = karate.size(entries.filter(function(e){ return e.name == null })) == 0\n* assert ok","typeGuard":"function hasName(e) { return e != null && (e.name != null || typeof e === 'object' && Object.keys(e).length > 0); }","tryCatchPattern":"try { scenario.run(step) } catch (RuntimeException e) { if (e.getMessage().startsWith(\"multipart files entry requires 'name'\")) { /* add name or use map-key form */ } throw e; }","preventionTips":["Always set `name` on list-form multipart file entries.","Prefer the V1 map form ({ name: { read: ... } }) when names are natural keys.","Validate generated entries in a helper before invoking the step.","Add `filename` when the server checks original filenames."],"tags":["karate","multipart","validation","http"],"backgroundTag":"missing-required-argument","analyzedSha":"a22eb90246d958d15a47bf436693d0121ad2812d","analyzedAt":"2026-09-12T09:01:00.220Z","contentChangedAt":"2026-09-12T09:01:00.220Z","schemaVersion":2},"datasetVersion":"2026-09-16T19:17:19.609Z"}