java - 在 Spring 中使用 RestTemplate 作为请求参数的 MultipartFile + String
问题描述
在我的 Spring Boot 应用程序中,我需要将 String 值与 MultipartFile 一起作为Requestparam
.
控制器在下面,我将MultipartFile转换为java.io.File
,然后借助restTemplate
.
来自 Angular 的请求将首先到达 Upload Controller,然后UploadController是客户端(Java),它将使用 Base URL
调用服务器svs-ba-dao Controller 。csvUpload
包含基本 URL:http://localhost:8082/svs-ba-dao/csvUpload?parentPkId=&file=multipartFile
@CrossOrigin
@RestController
public class UploadController {
private static final Logger log = LogManager.getLogger(UploadController.class);
@Value("${salama.dao.csvUpload.rest.url}")
private String csvUpload;
@Autowired
UploadHelperService uploadHelperService;
@PostMapping(value = "/csvUpload")
public String csvUpload(@QueryParam("parentPkId") String parentPkId, @RequestParam("file") MultipartFile file ) throws IllegalStateException, IOException{
log.info("Calling csvUpload :" + csvUpload);
final HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);
File cnvFile = uploadHelperService.multipartToFile(file,file.getOriginalFilename());
System.out.println("Converted File Name is -->"+cnvFile.getName());
final MultiValueMap<String, Object> data = new LinkedMultiValueMap<>();
data.add("parentPkId", parentPkId);
data.add("file", new FileSystemResource(cnvFile));
HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<MultiValueMap<String, Object>>(data, requestHeaders);
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> obj =restTemplate.exchange(csvUpload, HttpMethod.POST,
requestEntity, String.class);
return obj.getBody();
}
}
在 svs-ba-dao 控制器中捕获它如下
@RequestMapping(value="/csvUpload", method=RequestMethod.POST)
public String csvUpload(@RequestParam String parentPkId, @RequestParam MultipartFile file) throws IOException {
log.info("Entered method csvUpload() of svs-ba-dao.class");
return uploadService.csvUpload(parentPkId,file);
}
我已将这些属性包含在我的应用程序的 application.properties 文件中:
spring.servlet.multipart.maxFileSize=1MB spring.servlet.multipart.maxRequestSize=1MB
所以我启动我的应用程序并调用/csvUpload
生成 POST 请求的程序。
我正在低于错误。
Converted File Name is -->testInput_TxnMpMotSlv.csv
2019-01-24T15:12:41,217 ERROR [[localhost].[/svs-ba-dao].[dispatcherServlet]] [http-nio-8085-exec-2] Servlet.service() for servlet [dispatcherServlet] in context with path [/svs-ba-dao] threw exception [Request processing failed; nested exception is org.springframework.web.client.HttpServerErrorException: 500 null] with root cause
org.springframework.web.client.HttpServerErrorException: 500 null
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:97) ~[spring-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:79) ~[spring-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63) ~[spring-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:766) ~[spring-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:724) ~[spring-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:680) ~[spring-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:600) ~[spring-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at com.svs-ba-dao.controller.UploadController.csvUpload(UploadController.java:59) ~[classes/:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_192]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_192]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_192]
at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_192]
错误在 resttemplate 中,因为它取 null,但在语法上调用 RestTemplate 的方式是正确的,因为我没有收到任何错误。我是否正确调用基本 URL?通过传递
requestparam
值。即 parentPkId=?&file=multipartFile
http://localhost:8082/svs-ba-dao/csvUpload?parentPkId=&file=multipartFile
老实说我以前没有做过这个。在我做错的地方,欢迎任何线索或更正。提前致谢
解决方案
在这里我发现我错了
csvUpload 将保存应该在 rest 模板中传递的 URL
@Value("${salama.dao.csvUpload.rest.url}")
private String csvUpload;
我发现基本 URL:即从 UploadController
http://localhost:8082/svs-ba-dao/csvUpload?parentPkId=&file=multipartFile
发送的csvUpload是错误的。
无需在 URL中指定类似multipartFile
for的任何内容。mediaType
它会自动拿起。但是对于某些 URL 需要指定?mediaType=json
是否发送 JSON 对象。
这是我更新的基本URL:http://localhost:8082/svs-ba-dao/csvUpload?parentPkId=&file=
推荐阅读
- python - 从 ascii 文件中读取结构化数组
- php - 将原始 SQL 查询转换为 Laravel Eloquent
- swift - SwiftUI - PageView - 传入不同的视图
- vba - 如何通过使用 VBA 在 Access 中加载表单来使特定选项卡可见或不可见?
- r - 使用R中的data.table根据条件合并两行的值
- node.js - 使用 NodeJS 访问 cli 全局文件
- bash - Bash 替换 tail -f 后的前 4 个字符
- html - 如何使用 Facebook、Twitter、Whatsapp 和 Messenger 分享按钮分享当前页面?
- jira - 在 Jira 中进行自动转换
- google-cloud-datastore - 参考从对象修改字段并在保存包含对象时保存