I want to add an upload function to my spring boot application; this is my upload Rest Controller
package org.sid.web; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.util.LinkedMultiValueMap; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.servlet.mvc.support.RedirectAttributes; import org.springframework.core.env.Environment; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.FileSystemResource; import org.sid.entities.FileInfo; @RestController public class UploadController { @Autowired ServletContext context; @RequestMapping(value = "/fileupload/file", headers = ("content-type=multipart/*"), method = RequestMethod.POST, consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public ResponseEntity<FileInfo> upload(@RequestParam("file") MultipartFile inputFile) { FileInfo fileInfo = new FileInfo(); HttpHeaders headers = new HttpHeaders(); if (!inputFile.isEmpty()) { try { String originalFilename = inputFile.getOriginalFilename(); File destinationFile = new File( context.getRealPath("C:/Users/kamel/workspace/credit_app/uploaded") + File.separator + originalFilename); inputFile.transferTo(destinationFile); fileInfo.setFileName(destinationFile.getPath()); fileInfo.setFileSize(inputFile.getSize()); headers.add("File Uploaded Successfully - ", originalFilename); return new ResponseEntity<FileInfo>(fileInfo, headers, HttpStatus.OK); } catch (Exception e) { return new ResponseEntity<FileInfo>(HttpStatus.BAD_REQUEST); } } else { return new ResponseEntity<FileInfo>(HttpStatus.BAD_REQUEST); } } }
but when testing this in postman with inserting http://localhost:8082/fileupload/file and adding a file to the body i got this error: "exception": org.springframework.web.multipart.support.MissingServletRequestPartException", "message": "Required request part 'file' is not present
,
This is how your request in Postman should look like:
My sample code:
application.properties
#max file and request size spring.http.multipart.max-file-size=10MB spring.http.multipart.max-request-size=11MB
Main Application Class:
Application.java
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
Rest controller class:
import org.springframework.http.MediaType; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; @Controller @RequestMapping("/fileupload") public class MyRestController { @RequestMapping(value = "/file", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) public @ResponseBody String myService(@RequestParam("file") MultipartFile file, @RequestParam("id") String id) throws Exception { if (!file.isEmpty()) { //your logic } return "some json"; } }
pom.xml
//... <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.2.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> .... <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web-services</artifactId> </dependency> //...
In your method you have specified like this@RequestParam("file")
. Hence it is expecting the key to be file
. It is quite evident in the exception message. Use this name in the Key
field in Postman when you upload file.
More information here integration test case and file upload
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With