Mohammed Javed
Mohammed Javed

Reputation: 1093

The request was rejected because no multipart boundary was found in springboot

As I am trying this with spring boot and webservices with postman chrome add-ons.

In postman content-type="multipart/form-data" and I am getting the below exception.

HTTP Status 500 - Request processing failed; 
nested exception is org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request; 
nested exception is java.io.IOException: 
org.apache.tomcat.util.http.fileupload.FileUploadException: the request was rejected because no multipart boundary was found

In Controller I specified the below code

@ResponseBody
@RequestMapping(value = "/file", headers = "Content-Type= multipart/form-data", method = RequestMethod.POST)

public String upload(@RequestParam("name") String name,
        @RequestParam(value = "file", required = true) MultipartFile file)
//@RequestParam ()CommonsMultipartFile[] fileUpload
{
    // @RequestMapping(value="/newDocument", , method = RequestMethod.POST)
    if (!file.isEmpty()) {
        try {
            byte[] fileContent = file.getBytes();
            fileSystemHandler.create(123, fileContent, name);
            return "You successfully uploaded " + name + "!";
        } catch (Exception e) {
            return "You failed to upload " + name + " => " + e.getMessage();
        }
    } else {
        return "You failed to upload " + name + " because the file was empty.";
    }
}

Here I specify the file handler code

public String create(int jonId, byte[] fileContent, String name) {
    String status = "Created file...";
    try {
        String path = env.getProperty("file.uploadPath") + name;
        File newFile = new File(path);
        newFile.createNewFile();
        BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(newFile));
        stream.write(fileContent);
        stream.close();
    } catch (IOException ex) {
        status = "Failed to create file...";
        Logger.getLogger(FileSystemHandler.class.getName()).log(Level.SEVERE, null, ex);
    }
    return status;
}

Upvotes: 108

Views: 294548

Answers (11)

vishal thakur
vishal thakur

Reputation: 657

I sent data from angular reactive form of FormData and used ModelAttribute

Spring boot api @PostMapping(value = "/storecar") public ResponseEntity<?> postCar(@ModelAttribute PostCarsDto carRequest)

Upvotes: 0

Sanjay Amin
Sanjay Amin

Reputation: 411

You do not need to send Content-Type in Postman, leave the default setting as in Headers section. It should automatically calculate. enter image description here

In Body, you can select file as: enter image description here

At Spring controller side, you can add following code:

 @PostMapping("/upload")  
 public ResponseEntity<MyResponseObject> uploadFile(@RequestParam("file") MultipartFile myFile)
  throws IOException {...}

Upvotes: 0

Mr.A
Mr.A

Reputation: 41

You can try with below simple code, it should work. I tested on Advanced REST Client and below attached screenshot will help for configuration.

package com.example.demo;

import java.io.FileOutputStream;
import java.io.IOException;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

@RestController
public class ImageUploadController {

    @PostMapping("image-upload")
    public String uploadImage(@RequestParam MultipartFile myFile) throws IOException {
        
        byte[] bytes = myFile.getBytes();

        FileOutputStream fileOutputStream = new FileOutputStream("image.jpg");

        fileOutputStream.write(bytes);
        fileOutputStream.close();
        
        return "Image uploaded successfully..!";

    }
}

enter image description here

you can find uploaded image on below location in project.

enter image description here

Also please note that if your controller should be within the package of @SpringBootApplication package. You can refer below image.

enter image description here

Upvotes: 0

Bitzu
Bitzu

Reputation: 133

Heard you can do this in postman:

placeholders

Upvotes: 1

hao huang
hao huang

Reputation: 1

When I use postman to send a file which is 5.6M to an external network, I faced the same issue. The same action is succeeded on my own computer and local testing environment.

After checking all the server configs and HTTP headers, I found that the reason is Postman may have some trouble simulating requests to external HTTP requests. Finally, I did the sendfile request on the chrome HTML page successfully. Just as a reference :)

Upvotes: 0

de.la.ru
de.la.ru

Reputation: 3144

The problem is that you are setting the Content-Type by yourself, let it be blank. Google Chrome will do it for you. The multipart Content-Type needs to know the file boundary, and when you remove the Content-Type, Postman will do it automagically for you.

Upvotes: 168

Bala
Bala

Reputation: 411

Unchecked the content type in Postman and postman automatically detect the content type based on your input in the run time.

Sample

Upvotes: 28

Hanz
Hanz

Reputation: 264

I met this problem because I use request.js which writen base on axios
And I already set a defaults.headers in request.js

import axios from 'axios'
const request = axios.create({
  baseURL: '', 
  timeout: 15000 
})
service.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'

here is how I solve this
instead of

request.post('/manage/product/upload.do',
      param,config
    )

I use axios directly send request,and didn't add config

axios.post('/manage/product/upload.do',
      param
    )

hope this can solve your problem

Upvotes: 0

gorjanz
gorjanz

Reputation: 2014

This worked for me: Uploading a file via Postman, to a SpringMVC backend webapp:

Backend: Endpoint controller definition

Postman: Headers setup POST Body setup

Upvotes: 24

Reaz Murshed
Reaz Murshed

Reputation: 24211

I was having the same problem while making a POST request from Postman and later I could solve the problem by setting a custom Content-Type with a boundary value set along with it like this.

I thought people can run into similar problem and hence, I'm sharing my solution.

postman

Upvotes: 3

tomeokin
tomeokin

Reputation: 17

The "Postman - REST Client" is not suitable for doing post action with setting content-type.You can try to use "Advanced REST client" or others.

Additionally, headers was replace by consumes and produces since Spring 3.1 M2, see https://spring.io/blog/2011/06/13/spring-3-1-m2-spring-mvc-enhancements. And you can directly use produces = MediaType.MULTIPART_FORM_DATA_VALUE.

Upvotes: 0

Related Questions