猿问

在 Axios 中增加 maxContentLength 和 maxBodyLength

我正在使用“Axios”来调用 WCF 方法,该方法将文件信息和内容作为参数。该文件作为 base64 编码字符串被读取和发送。我的问题是,当文件大小超过某个限制时,AXIOS 会抛出异常:“错误:请求正文大于 maxBodyLength 限制”。我查了一下问题,发现所有解决方案都建议增加 AXIOS 配置对象中的 maxContentLength / maxBodyLength 参数,但没有成功。在 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)

        }

    }

    )();

就我而言,pdf 文件是 20 MB,运行时会抛出错误。“错误:请求正文大于 maxBodyLength 限制”


我尝试设置 maxContentLength: 100000000, maxBodyLength: 1000000000 如上所述,但没有成功。


感谢您的帮助。


慕村225694
浏览 1599回答 1
1回答

偶然的你

在这个简单的测试中,maxBodyLength 似乎对我有用,我将数据上传到本地 Express 服务器。如果我尝试上传超过 maxBodyLength 的内容,我会收到与您相同的错误。所以我怀疑还有更多的东西,比如在你的情况下发生的重定向触发了错误。此处记录的 axios 问题似乎引用了该问题,它建议将 maxContentLength 设置为 Infinity(正如其他评论者所建议的那样)。例如maxContentLength: Infinity,maxBodyLength: Infinity测试代码如下: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);对应的服务器代码: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}`);
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答