JsonとともにファイルをSpring Controllerに送信する必要があります。次のコントローラークラスがあります。
@Controller
@RequestMapping("/perform")
public class PerformController {
...
@RequestMapping(path = "gopdf", method = RequestMethod.POST, consumes = { "multipart/mixed" })
@ResponseStatus(HttpStatus.CREATED)
public void handleFileUpload(@RequestPart("file") MultipartFile file, @RequestPart("map") String map, HttpServletResponse response) throws Exception {
...
}
}
しかし、次のコマンドを使用してサーバーでカールする場合:
curl -H "Content-Type: multipart/form-data" -F "[email protected]; type=application/json" -F "[email protected]" -X POST localhost:9000/perform/gopdf-i -v
サポートされていないメディアタイプ415を取得しました。
どんな手掛かり ?
他の答えの消費物は私のためにがらくたをしませんでした。キーは、RequestMappingの一部のヘッダーキーでサポートしたい特定のmultipart/*タイプを取得することでした。理解するのは本当に難しく、ほとんどの場合、作業を推測してSpringソースコードをじっと見つめていました。私はこれに対するSpringのサポートに圧倒されていますが、Spring Boot Appで動作させることができましたが、Tomcatでのみですか?!?起動アプリケーションをJettyを使用するように構成すると、MultipartResolverチョークと呼ばれるものが...非常に長いJettyになります。しかし、私は脱線します...
私のコントローラーでは、マルチパート/ミックスまたはマルチパート/フォームデータのように設定します...
@RequestMapping(value = "/user/{userId}/scouting_activities", method = RequestMethod.POST,
headers = {"content-type=multipart/mixed","content-type=multipart/form-data"})
public ResponseEntity<String> POST_v1_scouting_activities(
@RequestHeader HttpHeaders headers,
@PathVariable String userId,
@RequestPart(value = "image", required = false) MultipartFile image,
@RequestPart(value = "scouting_activity", required = true) String scouting_activity_json) {
LOG.info("POST_v1_scouting_activities: headers.getContentType(): {}", headers.getContentType());
LOG.info("POST_v1_scouting_activities: userId: {}", userId);
LOG.info("POST_v1_scouting_activities: image.originalFilename: {}, image: {}",
(image!=null) ? image.getOriginalFilename() : null, image);
LOG.info("POST_v1_scouting_activities: scouting_activity_json.getType().getName(): {}, scouting_activity: {}",
scouting_activity_json.getClass().getName(), scouting_activity_json);
return new ResponseEntity<String>("POST_v1_scouting_activities\n", HttpStatus.OK);
}
そのヘッダーの事柄は、それがショットを撮影したいと思っていたマルチパートコンテンツタイプを一意に識別することができます。これにより、次のようなカールができます...
curl -i -X POST 'http://localhost:8080/robert/v1/140218/scouting_activities' \
-H 'Content-type:multipart/mixed' \
-F 'image=@Smile_128x128.png;type=image/png' \
-F 'scouting_activity={
"field": 14006513,
"longitude": -93.2038253,
"latitude": 38.5203231,
"note": "This is the center of Dino Head.",
"scouting_date": "2017-01-19T22:56:04.836Z"
};type=application/json'
...または...
curl -i -X POST 'http://localhost:8080/robert/v1/140218/scouting_activities' \
-H 'Content-type:multipart/form-data' \
-F 'image=@Smile_128x128.png;type=image/png' \
-F '[email protected];type=application/json'
作業。
私は解決策を見つけました:@RequestPartの代わりに@RequestParamを使用する必要があります
@RequestMapping(path = "gopdf", method = RequestMethod.POST, consumes = { "multipart/form-data" })
@ResponseStatus(HttpStatus.OK)
public void handleFileUpload2(@RequestParam("file") MultipartFile file, @RequestParam("map") String jsonMap,
HttpServletResponse response) throws Exceptio
Spring webflux(2.1.0)のmultipart/mixedは機能しませんでした。ここに働いた代替アプローチがあります
リクエストマッピングアノテーションに関連している可能性があります。どのサービスが受け入れることができるかを判断するためにaccept
値が欠落していると思います。
例:
@RequestMapping(path = "gopdf", method = RequestMethod.POST, consumes = { "multipart/mixed" }, accept = MediaType.MULTIPART_FORM_DATA_VALUE)
インポート:
import org.springframework.http.MediaType;
Documentation/API:http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/ springframework/http/MediaType.html