Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
816 views
in Technique[技术] by (71.8m points)

javascript - Increasing maxContentLength and maxBodyLength in Axios

I am using "Axios" to call a WCF method that takes as parameter file information and content. The file is read and sent as a base64 encoded string. My issue is that when the file size exceeds a certain limit, AXIOS throws an exception: "Error: Request body larger than maxBodyLength limit". I looked up the issue and found that all solutions suggest increasing the maxContentLength / maxBodyLength parameters in the AXIOS configuration object, but did not succeed. Find Below an implemented test case in node.js:

    var axios = require('axios');
    var fs = require('fs');
    var path = require('path')
    var util = require('util')
    let readfile = util.promisify(fs.readFile)

    async function sendData(url,data) {
        let params = data
    
        let resp = await axios({
            method: 'post',
            url: url,
            data: JSON.stringify(params),
            headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }
            // maxContentLength: 100000000,
            // maxBodyLength: 1000000000
        }).catch(err => {
            throw err;
        })
        return resp;
      }
    async function ReadFile(filepath) {
        try{
            
            let res = await readfile(filepath,'base64')
            let filename = path.basename(filepath).split('.').slice(0, -1).join('.')
            let ext = path.extname(filepath)
            
            return {data:res,fext:ext,fname:filename}
            let x = 1
        }
        catch(err)
        {
            throw err
        }
    
    }
    (async () => {
        try {
    
            let img = await ReadFile('Files/1.pdf')
            let res = await sendData('http://183.183.183.242/EMREngineEA/EMRWS.svc/web/EMR_TestUploadImg',img)
            console.log(res)
    
        }
        catch (ex) {
            console.log(ex)
        }
    }
    )();

In my case, the pdf file is 20 MB, upon running, an error is thrown. "Error: Request body larger than maxBodyLength limit"

I tried to setting the maxContentLength: 100000000, maxBodyLength: 1000000000 as presented above, but did not succeed.

Your help is appreciated.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

The maxBodyLength seems to work for me in this simple test, I upload data to a local Express server. If I try to upload more than the maxBodyLength I get the same error you're getting. So I suspect there's something more, like a redirect happening in your case that's triggering the error.

There is an issue logged for axios here that seems to reference the problem, it suggests setting maxContentLength to Infinity (as the other commenter suggests).

e.g.

maxContentLength: Infinity,
maxBodyLength: Infinity

Test code below:

const axios = require("axios");

function generateRandomData(size) {
    const a = Array.from({length: size}, (v, k) => Math.floor(Math.random()*100)); 
    return { data: a, id: 1 };
}

async function uploadData(url, size) {
    let params = generateRandomData(size);
    let stringData = JSON.stringify(params);
    console.log(`uploadData: Uploading ${stringData.length} byte(s)..`);
    let resp = await axios({
        method: 'post',
        url: url,
        data: stringData,
        headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' },
        maxContentLength: 100000000,
        maxBodyLength: 1000000000
    }).catch(err => {
        throw err;
    })
    console.log("uploadData: response:", resp.data);
    return resp;
}

uploadData("http://localhost:8080/upload", 10000000);

Corresponding server code:

const express = require("express");
const port = 8080;
const app = express();
const bodyParser = require('body-parser')

app.use(bodyParser.json({limit: '50mb'}));

app.post('/upload', (req, res, next) => {
    console.log("/upload: Received data: body length: ", req.headers['content-length']);
    res.json( { status: 'ok', bytesReceived: req.headers['content-length']});
})

app.listen(port);
console.log(`Serving at http://localhost:${port}`);

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...