【问题标题】:multipart/form-data request failed. Stream ended unexpectedly多部分/表单数据请求失败。直播意外结束
【发布时间】:2019-06-10 20:07:51
【问题描述】:

我正在将数据从 nodejs 应用程序发送到 spring rest 端点。我从文件中按照form-datafs.createReadStream 的示例进行操作,这很好。但是由于我的应用程序生成了这些数据,我真正需要的是发送存储在变量中的数据(作为字符串)。所以我按照answer 从字符串创建流,但在 Java 端我收到“流意外结束”错误。

var form = new FormData();
form.append('id', id);

// this works
//form.append('inputFiles[]', fs.createReadStream('test.xml'));

//this does not
const Readable = require('stream').Readable;
let s = new Readable();
s._read = () => {};
s.push('some data generated by my application');
s.push(null);

form.append('inputFiles[]', s);

form.submit(url, function(error, result) {
  if (error) {
    console.log('Error!');
  }
});

我需要以某种方式传输这些数据吗?或指定内容长度(如果是这样,我如何确定长度?)我尝试将{ filename : 'test.xml', contentType: 'application/xml' } 添加到可读文件中以模仿文件,但仍然得到相同的错误。

【问题讨论】:

    标签: node.js spring-mvc form-data


    【解决方案1】:

    我可以建议不同的方法吗?由于您使用的答案是 2014 年...

    let form = new FormData();
                    form.append('fieldName', 'fileBuffer/DataString', 'fileName');
    
                    axios.post('url', form, {
                        headers: {
                            'Content-Type': `multipart/form-data; boundary=${form._boundary}`
                        }
                    }).then((res) => {
                        console.log(res.data);
                        res.json(responseFromServer.data);
                    }).catch((err) => {
                        res.status(400).send(err);
                    });
    

    【讨论】:

      【解决方案2】:

      以防其他人遇到同样的问题——我需要拥有所有 3 个额外字段,包括 knownLength

          let stream = new Readable();
          stream.push(foo);
          stream.push(null);
          form.append('inputFiles[]', stream, {
            filename : 'test.xml',
            contentType: 'application/xml',
            knownLength: foo.length
          }); //extra fields necessary
      

      【讨论】:

      • 非常感谢。我正在寻找的确切解决方案。我认为 form-data 模块文档没有明确提到 form.append 函数的参数。
      【解决方案3】:

      我花了一些时间为此找到了一个合适的解决方案,终于能够解决它。

      我知道您实际上需要从缓冲区创建可读文件才能工作。

      我创建了一个类来简化此操作:

      const { Readable } = require('stream')
      
      module.exports = class FormData {
        /**
         *
         * @param {string} data The data to be converted
         * @param {string} name The file name
         * @param {string} type The file type
         */
        constructor (data, name, type) {
          const readStream = new Readable();
          readStream._read = () => {}
          readStream.push(Buffer.from(data))
          readStream.push(null)
      
          return {
            file: {
              value: readStream,
              options: {
                filename: name,
                contentType: type,
                knownLength: data.length,
              }
            }
          }
        }
      }
      

      现在,您所要做的就是创建一个实例并使用它调用请求函数。

      const request = require('request')
      
      const csv = // your csv content
      
      const formData = new FormData(csv, 'conversion.csv', 'text/csv; charset=utf-8')
      
      const options = {// the normal request options (headers etc.)
      
      options.formData = formData
      
      request('https://...', options).then(// your normal request call
      
      

      【讨论】:

        猜你喜欢
        • 2019-04-04
        • 2013-04-27
        • 1970-01-01
        • 1970-01-01
        • 2021-10-13
        • 2022-01-22
        • 1970-01-01
        • 1970-01-01
        • 2014-09-21
        相关资源
        最近更新 更多