多部分/表单数据请求失败。流意外结束

时间:2019-01-16 17:14:10

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

我正在将数据从Node.js应用程序发送到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' }以模仿文件,但仍然出现相同的错误。

3 个答案:

答案 0 :(得分:0)

我可以建议其他方法吗?由于您使用的答案来自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);
                });

答案 1 :(得分:0)

万一其他人遇到相同的问题,我需要拥有所有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

答案 2 :(得分:0)

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

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

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

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