【问题标题】:Multipart form parse error - Invalid boundary in multipart: None多部分表单解析错误 - 多部分中的边界无效:无
【发布时间】:2021-10-26 03:48:10
【问题描述】:

我很沮丧,找不到解决方案:

我正在使用 angularjs 和 nodejs 创建一个项目。我从节点 js 的角度侧获取图像数据并将此数据发送到进一步的 api。我收到错误

{
  "error": {
    "detail": "Multipart form parse error - Invalid boundary in multipart: None"
  }
}

这是我在 nodejs 端的代码:

var request = require('request');
    console.log(req.files);
var data = {

        website:'www.gamail.xom',
        contact_number:'dsdsd',
        services_offered:'dsadasd',
        contact_name:'dasdas',
        provider_category:'exchange',
        email:'kk@gmail.com',
        image:req.files

    }
var api_url = global.common.base_url + 'vcard/1.0.0/visit_card/' + req.param('uuid') +'/';
    request({
        url: api_url,
        method: 'PUT',
        headers: {
            'Content-Type': 'multipart/form-data',
            'Authorization': 'Bearer '+req.cookies.apitoken
        },
        json: data

    }, function(error, response, body) {
        if(response.statusCode == 200 && !error){
            res.end(JSON.stringify(body));
        }else{          
            res.send(response.statusCode, { error: body });
        }
    });
}

在 req.files 我得到

{ image:
   [ { fieldName: 'image[0]',
       originalFilename: 'icon_dd_chart_grey.png',
       path: 'C:\\Users\\karakuma\\AppData\\Local\\Temp\\op74_gLSzPs-_49aT1GF0si
7.png',
       headers: [Object],
       size: 1474,
       name: 'icon_dd_chart_grey.png',
       type: 'image/png' } ] }

【问题讨论】:

  • 你是如何解决这个问题的?还是没有解决?
  • 尝试删除 Content-Type Header?

标签: angularjs node.js form-data


【解决方案1】:

尝试如下定义内容类型。

content_type='multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW'

我遇到了同样的问题,它在 python 中对我有用。

【讨论】:

  • 你能解释一下这里发生了什么@Aamir
  • 这可能是一个真正的解决方案,但没有任何解释似乎没用
  • @Axel 你能解释一下你答案的“边界=-----”部分吗?
  • @DGG 老实说,我对此一无所知。我只是对答案做了一个非常简单的编辑。但是stackoverflow.com/questions/3508338/…duckduckgo.com/…
  • 很高兴帮助你@DGG!
【解决方案2】:

我在尝试上传文件时也遇到了这个问题。对我来说,问题是 FormData,它以 Object 而不是 FormData instance 的形式出现

所以我使用以下代码将我的对象转换为 FormData:

const getFormData = object => Object.keys(object).reduce((formData, key) => {
            formData.append(key, object[key]);
            return formData;
        }, new FormData());

刚刚执行了我的发布请求,在我的例子中使用了 Vue 资源:

return Vue.http.post(url,
        getFormData(formData),
        {
            headers: {
                'Content-Type': 'multipart/form-data'
            }
        });
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

【讨论】:

    【解决方案3】:

    header 中的内容类型无需提及,fetch() 会自行检测其内容类型。

    let formData = new FormData()
    formData.append("email", email);
    formData.append("password", password);
    formData.append("image", image);
    
    const response = await fetch('http://localhost:8000/api/authentication/register/', {
                    method: 'POST',
                    headers: {'X-CSRFToken': csrftoken}, //django specific
                    body: formData,
                });
    
    

    【讨论】:

      【解决方案4】:

      我在连接到 Django rest API 的 angular 11 中遇到了这个问题,我能够使用类似这样的方式进行 curl 以上传带有表单的 JSON:

      curl -X POST -S \
        -H 'Accept: application/json' \
        -u "user:password" \
        -F "name=name" \
        -F "label=mylabel" \
        -F "otherfields=something" \
        -F "photo=@./example.png;type=image/png" \
        http://127.0.0.1:8000/api/v1/item/
      

      但是我使用我的标头作为 httpOptions 得到了那个异常:

      'content-type': 'multipart/form-data',
      

      所以我刚刚注释掉了content-type,它看起来很聪明,他为你创建了标题并将多部分与边界一起设置。

      有关这方面的更多信息: What is the boundary in multipart/form-data?

      【讨论】:

        【解决方案5】:
        let data = fs.createReadStream('/home/insert/screen03.jpg');
            let form = new FormData();
        
            form.append('files', data, 'test.jpg');
        
            form.getLength((err, length) => {
                if (err) { reject(err); }
                let headers = Object.assign({ 'Content-Length': length, 'Authorization': `Token b84db005a7fc1e5471a763aa42fcc5734b7bb22a` }, form.getHeaders());
                return axios.post(`http://192.168.88.252:8000/resources/`, form, { headers: headers })
                    .then(res => console.log(res.data))
                    .catch(error => console.log(error.response.data))
            });
        

        【讨论】:

        • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助、质量更好,并且更有可能吸引投票
        • 您好,我的英语很差,我正在使用换能器。我不寻求投票,但我会发布适用于我的项目的代码,就像我会尝试发表评论一样
        • 我什至不知道誓言是为了什么
        猜你喜欢
        • 2023-03-03
        • 2013-09-06
        • 1970-01-01
        • 2020-04-03
        • 2014-01-23
        • 2015-12-29
        • 1970-01-01
        • 2011-01-05
        • 2010-11-07
        相关资源
        最近更新 更多