我正在将数据从Node.js应用程序发送到Spring Rest端点。我从文件中按照form-data到fs.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' }
以模仿文件,但仍然出现相同的错误。
答案 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