3

I'm running on the IBM public cloud. I have apu connect to access the cloud foundry microservice. I've gone through many of the posts and tried various things and I can't seem to get this to work. Here are my property file config settings for spring boot:

# The name of the application
spring.application.name=xxxxx

# web base path
management.endpoints.web.base-path=/

# Embedded tomcat config
server.tomcat.max-swallow-size=256MB
server.tomcat.max-http-post-size=256MB

# File size values
spring.servlet.multipart.max-file-size=256MB
spring.servlet.multipart.max-request-size=256MB
spring.servlet.multipart.enabled=true
    
# Server specific values
input.server=xxx
input.rtm.bucket=xxx
storage.server.base=xxx

# Cloudant database info
input.events.db.name=xxxx
input.ait.info.db.name=xxxx
letter.number.db.name=xxxx
letter.gen.data.db.name=xxxx


# Query index design documents
query.pad.ait.info.index.name=xxxx
query.pad.ait.info.deisgn.doc=_xxxx
query.rfa.ltr.index.name=xxxx
query.rfa.ltr.design.doc=xxxx

# The logging levels of the application
logging.level.application=DEBUG
#logging.level.root=DEBUG
#logging.level.org.springframework.web=INFO

# Testing
unit.testing=false
integration.testing=true

# Jackson json config
spring.jackson.mapper.accept-case-insensitive-properties=true

Here is the REST api function for POSTing the file

    @PostMapping(value = "/send/rtm/document/{errata}")
    public @ResponseBody ResponseEntity<Object> receiveRtmDocument(@PathVariable("errata") String errata, @RequestParam("file") MultipartFile file)

I'm using spring boot 2.1.6 and have not updated anything in the POM file. I'm attempting to send a 5.8 MB file to the api and it gives me this error:

com.ibm.tools.cloud.exceptions.DataNotJsonException: <html>
<head><title>413 Request Entity Too Large</title></head>
<body bgcolor="white">
<center><h1>413 Request Entity Too Large</h1></center>
<hr><center>openresty</center>
</body>
</html>

    at com.ibm.msc.gasm.sapt.input.AitInputManagement.sendRtmDocument(AitInputManagement.java:182)
    at com.ibm.msc.gasm.sapt.test.InputServiceTester.performTest(InputServiceTester.java:142)
    at com.ibm.msc.gasm.sapt.test.InputServiceTester.main(InputServiceTester.java:96)

Here is the send code I am using in java for the multipart. The only other headers I use that are not listed here are my authorization headers.

        // Create the URL connection
        HttpURLConnection conn = (HttpURLConnection) (new URL(requestUri)).openConnection();
        if (content != null || multipartFile) conn.setDoOutput(true);
        conn.setRequestMethod(method.toString());
        
        // Set the headers
        Enumeration<String> keys = headers.keys();
        while (keys.hasMoreElements())
        {
            // Pull out the key
            String key = keys.nextElement();
            
            // Set the header
            conn.setRequestProperty(key, headers.get(key));
        }
        
        // Set the accept header
        if (acceptHeader != null) conn.setRequestProperty("Accept", acceptHeader);
        
        // Set the content header
        if (contentTypeHeader != null) conn.setRequestProperty("Content-Type", contentTypeHeader);

        if (content != null)
        {
            // Set the content
            DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
            if (content.isFileContent()) dos.write(content.getFileContentAsByteArray());
            else if (content.isByteArrayContent()) dos.write(content.getContentAsByteArray());
            else if (content.isStringContent()) dos.write(content.getStringContentAsByteArray());

            // close the stream
            dos.flush();
            dos.close();
        }
        
        // Set the multipart file
        if (multipartFile)
        {
            // Set the properties
            conn.setUseCaches(false);
            conn.setRequestProperty("Connection", "Keep-Alive");
            conn.setRequestProperty("Cache-Control", "no-cache");
            conn.setRequestProperty("Content-Type", "multipart/form-data;boundry=" + MP_BOUNDRY);
            
            // Set the content
            DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
            dos.writeBytes(MP_HYPHENS + MP_BOUNDRY + StringUtils.crlf);
            dos.writeBytes("Content-Disposition: form-data: name=\"" + this.mpName + "\";filename=\"" + this.mpFileName + "\"" + StringUtils.crlf);
            dos.writeBytes(StringUtils.crlf);
            dos.write(IOUtils.toByteArray(new FileInputStream(this.mpFileNamePath)));
            dos.writeBytes(StringUtils.crlf);
            dos.writeBytes(MP_HYPHENS + MP_BOUNDRY + MP_HYPHENS + StringUtils.crlf);

            // close the stream
            dos.flush();
            dos.close();
        }
        
        // Get the response
        HttpResponseMessage response = null;
        try 
        {
            // Extract the stream
            InputStream is = (conn.getResponseCode() >= HttpURLConnection.HTTP_BAD_REQUEST) ? conn.getErrorStream() : conn.getInputStream();
            
            // Pull out the information
            byte[] data = IOUtils.toByteArray(is);
            
            // Set the response
            response = new HttpResponseMessage(requestUri, HttpStatusCode.getType(conn.getResponseCode()), acceptHeader, data, conn.getResponseMessage());
        }
        catch (Throwable e)
        {
            throw new IOException(String.format("Error reading results from %s", requestUri), e);
        }
        
        // Close the request
        conn.disconnect();

        // Send request
        return response;

I've tried several things, but I am not sure what I am missing. Anyone have any ideas how to fix this?

RC Forrester
  • 31
  • 1
  • 1
  • 5

2 Answers2

4

You need to change NGINX settings;

Add to config file next line

client_max_body_size 20M;

Use the form form to submit the file and accept it with MultipartFile. In this case (the other situation is not clear), the default file size is limited to 2M. If you want to upload a large file, you need to configure the file size.

https://www.cyberciti.biz/faq/linux-unix-bsd-nginx-413-request-entity-too-large/

Yeras_QazaQ
  • 77
  • 11
  • 1
    This is what helped me. I had Nginx for client. Everything seemed to work fine locally, at my computer, but broke on server. It showed 413 error for big requests. Anyway, this is what solves the issue. – user218046 Aug 30 '22 at 07:36
1

Try these two in your application.properties

server.tomcat.max-swallow-size=XMB //maximum size of the request body/payload
server.tomcat.max-http-post-size=XMB //maximum size of entire POST request

X is your desired integer representing megabyte.

Giorgi Tsiklauri
  • 9,715
  • 8
  • 45
  • 66