多部分表单分析错误-多部分中的边界无效:无

icnyk63a  于 2022-09-18  发布在  Java
关注(0)|答案(6)|浏览(211)

我很沮丧,找不到解决的办法:

我正在使用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.文件中

{ 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' } ] }
pcrecxhr

pcrecxhr1#

尝试按如下方式定义内容类型。

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

我也面临着同样的问题,这对我来说在Python中很管用。

lsmepo6l

lsmepo6l2#

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

因此,我使用以下代码将对象转换为FormData:

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

并且刚刚执行了我的POST请求,在我的例子中使用的是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>
pgx2nnw8

pgx2nnw83#

无需提及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,
            });
q3aa0525

q3aa05254#

在连接到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?

jk9hmnmh

jk9hmnmh5#

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))
    });
iq3niunx

iq3niunx6#

边界只是分隔多部分有效载荷的多个“部分”的“关键”。通常,像‘&’这样的代码就足以分隔变量,但您需要更独特的代码来分隔有效负载注解中的有效负载

您可以使用发送的数据中未出现的任何值。
注意:因为边界分隔符不能出现在被封装的主体部分中,所以用户代理必须谨慎地选择唯一的边界参数值。

最简单的边界分隔线可能类似于“-”,其闭合边界分隔线为“-”。

相关问题