better way to POST multipart files with JSON data springboot

Viewed 18

I am working on a spring boot project, I have a customer model which consists of properties, including image paths which I am storing in the file system or folder and uploading the entire form with image paths in DB, I have successfully implemented my target task however I was wondering if there is a better and nicer way to achieve this, your answers, comments, and feedbacks are appreciated here is my code

Customer model:

public class Customer {
    private String contactMode = "Mobile Number";
    @Pattern(regexp ="(251|0)[0-9]{9}" , message = "Invalid phone number")
    private String phoneNumber;  // phone number
    private String identityType = "101-ID [0]";
    @NotNull(message = "ID number is required")
    private String idNumber;
    private String countryOfIssue = "XXXXXXX";
    @NotNull(message = "Issue date is required")
    @PastOrPresent(message = "Issue date cannot be future date")
    private Date issueDate;
    @Future(message = "Expiry date cannot be in the past or present")
    @NotNull(message = "Expiry date is required")
    private Date expiryDate;

// storing customerImage , customerID and customerSignature paths in DB
    private String customerImage;
    private String customerID;
    private String customerSignature;
}

Customer Service:

private String path = "C:\Users\User\Desktop\docs\uploaded_files\";

public Customer saveCustomer(Customer customer, MultipartFile customerImage, MultipartFile customerID,
                                 MultipartFile customerSignature) throws Exception {

        final String PATH = path + customer.getContactDetail();

        Customer phoneNumberExists = customerRepository.findByContactDetail(customer.getContactDetail());
        
        byte[] imageBytes = customerImage.getBytes();
        byte[] idBytes = customerID.getBytes();
        byte[] signatureBytes = customerSignature.getBytes();

        Path customerImagePath = Paths.get
                (PATH + "_photo_" + customerImage.getOriginalFilename());
        Files.write(customerImagePath, imageBytes);

        Path customerIDPath =
                Paths.get(PATH + "_ID_" + customerID.getOriginalFilename());
        Files.write(customerIDPath, idBytes);

        Path customerSignaturePath =
                Paths.get(PATH + "_Sign_" + customerSignature.getOriginalFilename() + "");
        Files.write(customerSignaturePath, signatureBytes);
        
        if (phoneNumberExists != null) {
            throw new PhoneNumberTakenException("Phone number is taken ");
        }

        customer.setAge(new Date().getYear() - customer.getDateOfBirth().getYear());
        customer.setCustomerImage(String.valueOf(customerImagePath));
        customer.setCustomerID(String.valueOf(customerIDPath));
        customer.setCustomerSignature(String.valueOf(customerSignaturePath));
        customer.setFromDate(LocalDate.now());
        customer.setStatus(Customer.Status.Submitted);

        Customer customerRecord = customerRepository.saveAndFlush(customer);
return customerRecord;

}

Customer Controller : look at how iam passing multipart files and other fields in the controller to service

 @PostMapping()
    public ResponseEntity<Customer> createCustomer(@Valid @RequestPart("customer") String customer, MultipartFile customerImage, MultipartFile customerID, MultipartFile customerSignature
    ) throws Exception {

        ObjectMapper customerMapper = new ObjectMapper();
        Customer savedCustomer = customerMapper.readValue(customer, Customer.class);
        Customer customerRecord = customerService.saveCustomer(savedCustomer, customerImage, customerID, customerSignature);
        log.debug("inside createCustomer() controller : {}", customerRecord);
        return ResponseEntity.status(HttpStatus.CREATED).body(customerRecord);

    }

Postman post request to the endpoint:

Postman response :

enter image description here

0 Answers
Related