[BAEL-4829] Multipart request in spring

This commit is contained in:
uzma khan 2021-05-15 18:31:23 +01:00
parent 7e921762b6
commit 1506fdef1f
9 changed files with 207 additions and 0 deletions

View File

@ -24,6 +24,11 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- runtime and test scoped -->
<dependency>
<groupId>org.springframework.boot</groupId>

View File

@ -0,0 +1,16 @@
package com.baeldung.multipartupload;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.web.multipart.MultipartFile;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Employee {
private String name;
private MultipartFile document;
}

View File

@ -0,0 +1,49 @@
package com.baeldung.multipartupload;
import lombok.AllArgsConstructor;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.multipart.MultipartFile;
import static org.springframework.web.bind.annotation.RequestMethod.POST;
@Controller
@AllArgsConstructor
public class EmployeeController {
private final EmployeeService employeeService;
@GetMapping(value = "/employee")
public String showEmployeeForm(Model model) {
model.addAttribute("employee", new Employee());
return "employee/createEmployeeForm";
}
@RequestMapping(path = "/employee", method = POST, consumes = { MediaType.MULTIPART_FORM_DATA_VALUE })
public String saveEmployee(@ModelAttribute Employee employee) {
employeeService.save(employee);
return "employee/success";
}
@RequestMapping(path = "/requestpart/employee", method = POST, consumes = { MediaType.MULTIPART_FORM_DATA_VALUE })
public ResponseEntity<Object> saveEmployee(@RequestPart Employee employee, @RequestPart MultipartFile document) {
employee.setDocument(document);
employeeService.save(employee);
return ResponseEntity.ok().build();
}
@RequestMapping(path = "/requestparam/employee", method = POST, consumes = { MediaType.MULTIPART_FORM_DATA_VALUE })
public ResponseEntity<Object> saveEmployee(@RequestParam String name, @RequestPart MultipartFile document) {
Employee employee = new Employee(name, document);
employeeService.save(employee);
return ResponseEntity.ok().build();
}
}

View File

@ -0,0 +1,8 @@
package com.baeldung.multipartupload;
import org.springframework.stereotype.Repository;
@Repository
public interface EmployeeRepository {
void saveEmployee(Employee employee);
}

View File

@ -0,0 +1,36 @@
package com.baeldung.multipartupload;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
@Service
public class EmployeeService {
public void save(Employee employee) {
saveFile(employee.getDocument());
// save other employee data
}
private void saveFile(MultipartFile multipartFile) {
try {
saveToFilesystem(multipartFile);
} catch (Exception e) {
throw new RuntimeException("Unable to save file", e);
}
}
private static void saveToFilesystem(MultipartFile multipartFile) throws IOException {
String dir = Files.createTempDirectory("tmpDir").toFile().getAbsolutePath();
File file = new File(dir + File.pathSeparator + multipartFile.getName());
try (OutputStream os = new FileOutputStream(file)) {
os.write(multipartFile.getBytes());
}
}
}

View File

@ -0,0 +1,13 @@
package com.baeldung.multipartupload;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MultipartUploadApplication {
public static void main(String[] args) {
SpringApplication.run(MultipartUploadApplication.class, args);
}
}

View File

@ -0,0 +1,16 @@
<!DOCTYPE HTML>
<html xmlns:th="https://www.thymeleaf.org">
<head>
<title>Getting Started: Handling Form Submission</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<h1>Form</h1>
<form action="#" th:action="@{/employee}" th:object="${employee}" method="post" enctype="multipart/form-data">
<p>name: <input type="text" th:field="*{name}" /></p>
<p>document:<input type="file" th:field="*{document}" multiple="multiple"/>
<input type="submit" value="upload" />
<input type="reset" value="Reset" /></p>
</form>
</body>
</html>

View File

@ -0,0 +1,8 @@
<!DOCTYPE HTML>
<html xmlns:th="https://www.thymeleaf.org">
<head>
</head>
<body>
Employee data submitted.
</body>
</html>

View File

@ -0,0 +1,56 @@
package com.baeldung.multipartupload;
import org.junit.jupiter.api.Test;
import org.mockito.BDDMockito;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import static org.apache.http.entity.ContentType.DEFAULT_BINARY;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.multipart;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@WebMvcTest
@EnableWebMvc
public class EmployeeControllerIntegrationTest {
private static final MockMultipartFile A_FILE = new MockMultipartFile("document", null, DEFAULT_BINARY.toString(), "Employee Record".getBytes());
@Autowired
private MockMvc mockMvc;
@MockBean
private EmployeeService employeeService;
@Test
public void givenFormData_whenPost_thenReturns200OK() throws Exception {
mockMvc.perform(multipart("/employee")
.file(A_FILE)
.param("name", "testname"))
.andExpect(status().isOk());
}
@Test
public void givenEmployeeJsonAndMultipartFile_whenPostWithRequestPart_thenReturnsOK() throws Exception {
MockMultipartFile employeeJson = new MockMultipartFile("employee", null,
"application/json", "{\"name\": \"Emp Name\"}".getBytes());
mockMvc.perform(multipart("/requestpart/employee")
.file(A_FILE)
.file(employeeJson))
.andExpect(status().isOk());
}
@Test
public void givenRequestPartAndRequestParam_whenPost_thenReturns200OK() throws Exception {
mockMvc.perform(multipart("/requestparam/employee")
.file(A_FILE)
.param("name", "testname"))
.andExpect(status().isOk());
}
}