使用以下代码
private def uploadImageFile(assetId: String, apiKey: String, authToken: String, file: MultipartFile, hostUrl: String, restTemplate: RestTemplate): ResponseEntity[util.Map[String, String]] = {
val assignFileToAssetUrl = s"$hostUrl/..."
var multipartRequest: MultiValueMap[String, Object] = new LinkedMultiValueMap[String, Object]()
multipartRequest.add("file", file.getBytes)
multipartRequest.add("name", "file")
multipartRequest.add("filename", file.getOriginalFilename)
multipartRequest.add("apiKey", apiKey)
multipartRequest.add("authToken", authToken)
println("Created multipart request: " + multipartRequest)
var headers: HttpHeaders= new HttpHeaders()
headers.setContentType(MediaType.MULTIPART_FORM_DATA)
val request: HttpEntity[Object] = new HttpEntity[Object](multipartRequest, headers);
println("request: " + request)
var messageConverters: util.List[HttpMessageConverter[_]] = new util.ArrayList[HttpMessageConverter[_]]();
messageConverters.add(new FormHttpMessageConverter());
messageConverters.add(new MappingJackson2HttpMessageConverter());
restTemplate.setMessageConverters(messageConverters);
val httpResponse: ResponseEntity[util.Map[String, String]] = restTemplate.postForEntity(assignFileToAssetUrl, multipartRequest, classOf[java.util.Map[String, String]])
if (!httpResponse.getStatusCode().equals(HttpStatus.OK)){
println("Problems with the request. Http status: " + httpResponse.getStatusCode());
}
httpResponse
}
日志文件显示
2016-07-16 20:47:01.744 DEBUG 4423 --- [nio-8080-exec-1] o.s.web.client.RestTemplate : Writing [{file=[[B@6abe44a9], name=[file], filename=[TB1YvKKKVXXXXXQXpXXXXXXXXXX-492-660.jpg], apiKey=[...], authToken=[...]}] using [org.springframework.http.converter.FormHttpMessageConverter@230f7e0d]
表示使用了FormHttpMessageConverter,它产生400错误。如果我切换添加到列表中的两个消息转换器的顺序。日志消息将显示使用MappingJackson2HttpMessageConverter并产生500错误。
将图像文件与其他一些数据一起发布的正确方法是什么?
上面的代码在Scala中。我将Java代码移植到Scala中。它对Java人来说应该是稳定的。
更新: 我没有运气就根据答案做出改变。我仍然得到400错误。注意我替换了" authToken"密钥与"授权"。以下是更改后的代码:
private def assignFileToAsset(assetId: String, apiKey: String, authToken: String, file: MultipartFile, hostUrl: String, restTemplate: RestTemplate): ResponseEntity[util.Map[String, String]] = {
val assignFileToAssetUrl = s"$hostUrl/..."
var multipartRequest: MultiValueMap[String, Object] = new LinkedMultiValueMap[String, Object]()
multipartRequest.add("file", file.getBytes)
multipartRequest.add("name", "file")
multipartRequest.add("filename", file.getOriginalFilename)
println("Created multipart request: " + multipartRequest)
var headers: HttpHeaders= new HttpHeaders()
headers.add("apiKey", apiKey)
headers.add("Authorization", authToken)
headers.setContentType(MediaType.MULTIPART_FORM_DATA)
val request: HttpEntity[Object] = new HttpEntity[Object](multipartRequest, headers);
println("request: " + request)
println("Posting request to: " + assignFileToAssetUrl)
val httpResponse: ResponseEntity[util.Map[String, String]] = restTemplate.postForEntity(assignFileToAssetUrl, multipartRequest, classOf[java.util.Map[String, String]])
if (!httpResponse.getStatusCode().equals(HttpStatus.OK)){
println("Problems with the request. Http status: " + httpResponse.getStatusCode());
}
httpResponse
}
答案 0 :(得分:0)
我认为您可能需要使用http标头发送访问令牌,其他参数和文件内容应该沿着http主体发送。预期的代码(没有精确的语法)
@RequestMapping(value = "/yourMapping", method = RequestMethod.POST)
public @ResponseBody String yourMethod(HttpServletRequest request) {
RestTemplate template = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
headers.add("Authorization", authToken);
LinkedMultiValueMap<String, Object> map =
new LinkedMultiValueMap<>();
map.add("your_param_key", "your_param_value");
map.add("files", your_file_content_in_byte_array);
HttpEntity<LinkedMultiValueMap<String, Object>>
requestEntity = new HttpEntity<>(map, headers);
String response = restTemplate.postForObject
(uploadFilesUrl, requestEntity, String.class);
}
请参阅以下帖子了解更多信息。
http://techie-mixture.blogspot.com/2016/07/authentcation-with-rest-template.html
http://techie-mixture.blogspot.com/2016/07/sending-multipart-files-using-spring.html