如何在空手道中使用多部分上传多个文件
How do I upload multiple files with multipart in Karate
我想使用 multipart 在一个请求中上传多个图像文件。我已经查看了关于此的空手道示例,但是多文件上传不符合我的需要(/multiple endpoint here - https://github.com/intuit/karate/blob/master/karate-demo/src/main/java/com/intuit/karate/demo/controller/UploadController.java)。我的服务方法 (Spring REST) 签名需要一个 MultipartFile[] 数组,这样我就可以接受任意数量的文件。这是我的场景:
Scenario: Upload multiple files
* def json = {}
* set json.files[0] = { read: 'file1.jpg', filename: 'file1.jpg', contentType: 'image/jpeg' }
* set json.files[1] = { read: 'file2.jpg', filename: 'file2.jpg', contentType: 'image/jpeg' }
Given path '/rest'
And multipart files json
When method post
Then status 200
这里是 Spring 网络服务方法(只是试图立即接收文件,所以该方法没有做太多):
@PostMapping("/rest")
public String handleFileUpload(@RequestParam("file") MultipartFile[] file) {
System.out.println("Len: " + file.length);
for(MultipartFile currentFile : file) {
System.out.println("In here: " + currentFile.getOriginalFilename());
}
return file[0].getOriginalFilename();
}
当我 运行 收到空手道错误时:'multipart file value should be json'
如果我改变场景来做到这一点:
Scenario: Upload multiple files
* def json = {}
* set json.files = { read: 'file1.jpg', filename: 'file1.jpg', contentType: 'image/jpeg' }, { read: 'file2.jpg', filename: 'file2.jpg', contentType: 'image/jpeg' }
Given path '/rest'
And multipart files json
When method post
Then status 200
然后测试执行正常,但只有一个文件最终出现在 MultipartFile 数组中 'files'(服务方法参数)。
使用空手道将多个文件上传到上述网络服务方法的正确方法是什么?
编辑:添加客户端代码(下方)并更新上方的 Spring 方法。
这是一个简单的 HTML 表单,它将向上面的 Spring 方法提交多个文件:
<form method="POST" enctype="multipart/form-data" action="/rest">
<table>
<tr><td>File to upload:</td><td><input type="file" name="file" /></td></tr>
<tr><td>File to upload:</td><td><input type="file" name="file" /></td></tr>
<tr><td></td><td><input type="submit" value="Upload" /></td></tr>
</table>
</form>
提交后,我在服务方法中获得了 2 个文件。
哇,以前从没见过这个,很可能空手道不支持它。我还想知道这是否符合 HTTP 规范 - 据我所知 - 每个文件都必须具有唯一的字段名称。您是否有 Apache HTTP 客户端的相应客户端代码,这会有所帮助。
编辑:另见 Esteban Lopez below:
的回答
您最好的选择可能是提交功能请求并贡献代码以加快速度。请注意,这是 2 年来第一次有人将此问题报告为问题。
看来是可以的,你只需要在特征文件中发送相同的参数两次即可
和多部分文件 files = { read: 'mergeTest.pdf', filename: 'upload-name.pdf', contentType: 'application/pdf' }
和多部分文件 files = { read: 'mergeTest.pdf', filename: 'upload-name.pdf', contentType: 'application/pdf' }
和多部分字段文件元数据= ................................... ......
我的服务:
public ResponseEntity<StreamingResponseBody> mergePdfs(@RequestPart @Validated
List<FileMetaData> filesMetadata, @RequestPart @Validated List<MultipartFile> files)
我想使用 multipart 在一个请求中上传多个图像文件。我已经查看了关于此的空手道示例,但是多文件上传不符合我的需要(/multiple endpoint here - https://github.com/intuit/karate/blob/master/karate-demo/src/main/java/com/intuit/karate/demo/controller/UploadController.java)。我的服务方法 (Spring REST) 签名需要一个 MultipartFile[] 数组,这样我就可以接受任意数量的文件。这是我的场景:
Scenario: Upload multiple files
* def json = {}
* set json.files[0] = { read: 'file1.jpg', filename: 'file1.jpg', contentType: 'image/jpeg' }
* set json.files[1] = { read: 'file2.jpg', filename: 'file2.jpg', contentType: 'image/jpeg' }
Given path '/rest'
And multipart files json
When method post
Then status 200
这里是 Spring 网络服务方法(只是试图立即接收文件,所以该方法没有做太多):
@PostMapping("/rest")
public String handleFileUpload(@RequestParam("file") MultipartFile[] file) {
System.out.println("Len: " + file.length);
for(MultipartFile currentFile : file) {
System.out.println("In here: " + currentFile.getOriginalFilename());
}
return file[0].getOriginalFilename();
}
当我 运行 收到空手道错误时:'multipart file value should be json'
如果我改变场景来做到这一点:
Scenario: Upload multiple files
* def json = {}
* set json.files = { read: 'file1.jpg', filename: 'file1.jpg', contentType: 'image/jpeg' }, { read: 'file2.jpg', filename: 'file2.jpg', contentType: 'image/jpeg' }
Given path '/rest'
And multipart files json
When method post
Then status 200
然后测试执行正常,但只有一个文件最终出现在 MultipartFile 数组中 'files'(服务方法参数)。
使用空手道将多个文件上传到上述网络服务方法的正确方法是什么?
编辑:添加客户端代码(下方)并更新上方的 Spring 方法。
这是一个简单的 HTML 表单,它将向上面的 Spring 方法提交多个文件:
<form method="POST" enctype="multipart/form-data" action="/rest">
<table>
<tr><td>File to upload:</td><td><input type="file" name="file" /></td></tr>
<tr><td>File to upload:</td><td><input type="file" name="file" /></td></tr>
<tr><td></td><td><input type="submit" value="Upload" /></td></tr>
</table>
</form>
提交后,我在服务方法中获得了 2 个文件。
哇,以前从没见过这个,很可能空手道不支持它。我还想知道这是否符合 HTTP 规范 - 据我所知 - 每个文件都必须具有唯一的字段名称。您是否有 Apache HTTP 客户端的相应客户端代码,这会有所帮助。
编辑:另见 Esteban Lopez below:
您最好的选择可能是提交功能请求并贡献代码以加快速度。请注意,这是 2 年来第一次有人将此问题报告为问题。
看来是可以的,你只需要在特征文件中发送相同的参数两次即可
和多部分文件 files = { read: 'mergeTest.pdf', filename: 'upload-name.pdf', contentType: 'application/pdf' }
和多部分文件 files = { read: 'mergeTest.pdf', filename: 'upload-name.pdf', contentType: 'application/pdf' }
和多部分字段文件元数据= ................................... ......
我的服务:
public ResponseEntity<StreamingResponseBody> mergePdfs(@RequestPart @Validated
List<FileMetaData> filesMetadata, @RequestPart @Validated List<MultipartFile> files)