java restTemplate PUT
Spring Frameworkが提供するHTTPクライアントです。
ContentTypeはapplication/octet-stream
を使い、ファイルのbyte[]のデータを送信する実装例です。
- controller側の実装
- リクエストボディにbyte[]を使用し、その値をファイルに書き込みます。
- ヘッダー情報は念のため出力。
@PutMapping("saveFile")
public String saveFile(@RequestBody byte[] fileData, @RequestHeader HttpHeaders headers) {
try {
String filePath = "./tmp/sampleFile.txt";
File file = new File(filePath);
FileOutputStream outputStream = new FileOutputStream(file);
outputStream.write(fileData);
outputStream.close();
System.out.println(headers.getContentLength());
System.out.println(headers.get("MD5").get(0));
return "File saved successfully.";
catch (IOException e) {
e.printStackTrace();
return "Error saving file.";
}
}
- リクエスト送信側の実装
- ローカルのファイルをFiles.readAllBytesにてバイト変換。※一括変換のためメモリ許容範囲内のデータであること。
- RequestEntity<byte[]>を定義し、リクエストボディ部にbyte[]を設定。
- ヘッダーのContentTypeは
application/octet-stream
を使用。 - restTemplate.exchangeにて上記controllerにリクエスト送信。
public static void main(String[] args) throws IOException {
try {
String url = "http://localhost:8080/saveFile";
String filePath = "./restFile.txt";
RestTemplate restTemplate = new RestTemplate();
byte[] bytes = Files.readAllBytes(Paths.get(filePath));
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
headers.setContentLength(Files.size(Paths.get(filePath)));
String hexString = DigestUtils.md5DigestAsHex(new FileInputStream(new File(filePath)));
headers.add("MD5", hexString);
RequestEntity<byte[]> requestEntity =
new RequestEntity<>(bytes, headers, HttpMethod.PUT, new URI(url));
ResponseEntity<byte[]> response = restTemplate.exchange(requestEntity, byte[].class);
if (response.getStatusCode() == HttpStatus.OK) {
System.out.println("success");
}
} catch (Exception e) {
e.printStackTrace();
}
}
ちなみに
byte[]の上限は2GB(環境によって1GB)でoutOfMemoryになるので、ファイルが大きすぎる場合は、送り方を変えたり、ファイルサイズを小さくするなど、考慮したほうがいいと思います。