具有内容类型的NodeJS发布请求:multipart / form-data故障排除

时间:2017-07-17 16:45:56

标签: node.js request content-type content-disposition dataform

我正在尝试将dataUrl发送到客户端的服务器。

请求被发送到带有 Content-Type:multipart / form-data 的php脚本以及 image =(dataUri string)的键/值消息体

如果已成功收到,则会发回10位数的回复。如果不成功,则发送错误响应。

我使用datauri module生成dataurl

如果我尝试使用以下方法通过终端执行此操作:

val=`cat dataUri.txt` #generated via datauri module
curl -X POST -F 'image='$val http://xxx.yyyyyyy.com:8082/server/post.php

我成功了。

当尝试使用节点和http.request时,我失败了:(。通过反复试验和谷歌搜索的负载我偶然发现--trace-ascii,它给你一个非常详细的终端通信故障。所以我一直试图有效地复制标题等,希望我能使它发挥作用。

我的请求代码目前看起来像这样:

    var body = 'image='+dataUri ;

    postOptions = {

        headers: {
          'Content-Type': 'multipart/form-data; boundary=------------------------69b2c2b9c464731d' ,
          'Content-Disposition': 'form-data; name="image"' ,
          'Content-Length': Buffer.byteLength(body) ,
          'Accept': '*/*' ,
          'Expect': '100-continue'
        } ,

        host: 'xxx.yyyyyyy.com' ,
        port: '8082' ,
        path: '/server/post.php' ,
        method: 'POST'
    } ; 

    // Set up the request
    post_req = http.request(
        postOptions, 
        function(res) {
            // 
          res.setEncoding('utf8') ;

          res.on('data', function (chunk) {
              console.log('Response: ' + chunk) ;
          }) ;

        }) ;

    // post the data
    post_req.write(body) ;
    post_req.end() ;

每次都失败。我注意到的一点:在终端中,Content-Length Number大于我在Node中使用Buffer.byteLength得到的几百字节。

很抱歉忽略服务器信息。我不确定我是否可以发布它...

任何人都可以给我任何提示,我应该阅读的任何信息链接,关键字,任何真的。我还有很长的路要走,这非常肯定我应该使用某种类型的抽象,比如Express,但你必须从某个地方开始。

2 个答案:

答案 0 :(得分:1)

想通了。答案是here

我没有正确使用 Content-Disposition 。它并不意味着它是一个标题,它意味着成为消息体的一部分(这解释了更大的 Content-Length

正确的代码:

    var boundary = '------------------------69b2c2b9c464731d'


    var body = `--${boundary}
                \nContent-Disposition: form-data; name="image"

                \nContent-type: plain/text
                \nimage=${img}
                \n${boundary}--`;

    postOptions = {

        headers: {
          'Content-Type': 'multipart/form-data; boundary='+boundary ,
          'Content-Length': Buffer.byteLength(body)
        } ,

        host: 'xxx.yyyyyyyyyy.com' ,
        port: '8082' ,
        path: '/server/post.php' ,
        method: 'POST'
    } ; 

    // Set up the request
    post_req = http.request(
        postOptions, 
        function(res) {
            // 
          res.setEncoding('utf8') ;

          res.on('data', function (chunk) {
              console.log('Response: ' + chunk) ;
          }) ;

        }) ;

    // post the data
    post_req.write(body) ;
    post_req.end() ;

答案 1 :(得分:0)

@Andreas的回答帮助我,但有一个错误(?)

\n${boundary}--`; 可能应该替换为 \n--${boundary}--`;