我需要从客户端发送一个多部分/表单数据POST(xliff文件)到我的Node.js服务器,然后在Node.js捕获数据并将该POST转发到另一个Java服务。
我使用了multer
和Expres-fileupload
来解析表单数据流,并在Node.js中捕获xliff的Buffer,并且都给了我文件,其内容作为缓冲区。
但是,我似乎无法在Node层中重新创建FormData对象来将POST转发到Java服务。
我继续从Java服务中得到错误消息“连接终止解析多部分数据”,或者根本没有响应。
我还尝试使用tmp
库在本地创建一个临时文件来写入缓冲区,然后尝试FormData('file',fs.createReadStream)(
直接从浏览器中使用完全相同的
doPOST
请求可以很好地工作,但是一旦我尝试在节点层捕获调用,然后将POST转发到Java服务,它就不再适用于我了。
.
const multer = require('multer');
const upload = multer();
router.post('/', upload.any(), (req, res) => {
const { headers, files } = req;
console.log('--------------- files:', files[0]); // object with buffer, etc.
const XMLString = files[0].buffer.toString('utf8'); // xml string of the xliff
const formFile = new FormData();
formFile.append('file', XMLString);
console.log('--------------- formFile:', formFile); // FormData object with a key of _streams: [<xml string with boundaries>, [Function: bound ]]
headers['Content-Type'] = 'multipart/form-data';
const url = 'some/url/to/Java/service'
doPOST(url, formFile, {}, headers)
.catch((error) => {
const { status, data } = error.response;
res.status(status).send(data);
})
.then(({ data }) => {
res.send(data);
});
});
对于面临"FileUploadExcema:请求被拒绝,因为没有找到多部分边界"
的人来说,这就是你需要做的。
https://github.com/axios/axios/issues/1006
这为我解决了这个问题。它不是特定于axios的,我们只需要转发发送请求时计算的formData头。
对于多部分/表单数据,边界是根据文件内容计算的。浏览器自动执行。但在node.js我们需要明确转发这些。由于form-data
npm包,这些都为您完成了。
这是我在NodeJS中提出的解决方案的一个伪代码示例。我在ApolloGQL中使用了类似的解决方案,但它同样适用于ExpressJS。因此,我的示例的模式更类似于ExpressJS。
在下面的示例中,演示了如何在发送JSON对象之前将文件缓冲区传递到FormData中。
const FormData = require('form-data'); // version ^3.0.0
router.post('/', async (req, res) => {
const { body } = req;
const { stringContentOfSomeFile } = body;
// create formData for your request:
const thisForm = new FormData();
// passing a JSON object:
// must declare "contentType: application/json" to avoid 415 status response from some systems:
const someJson = JSON.stringify({ key: 'value', otherKey: 'otherValue' });
thisForm.append('data', someJson, { contentType: 'application/json' });
// passing a file buffer:
const fileBuffer = Buffer.from(stringContentOfSomeFile, 'utf-8');
thisForm.append('form_field_name_here', fileBuffer, 'file_name_here');
const response = await axios.post('/path/to/endpoint', thisForm, {
// must getHeaders() from "formData" to define the boundaries of the appended data:
headers: { ...thisForm.getHeaders() },
});
// do whatever you need with the response:
res.send(response);
});
您可以直接将缓冲区
传递到表单数据,但是您还需要指定filename
参数。
const multer = require('multer');
const upload = multer();
router.post('/', upload.any(), (req, res) => {
const { headers, files } = req;
const { buffer, originalname: filename } = files[0];
const formFile = new FormData();
formFile.append('file', buffer, { filename });
headers['Content-Type'] = 'multipart/form-data';
const url = 'some/url/to/Java/service'
doPOST(url, formFile, {}, headers)
.catch((error) => {
const { status, data } = error.response;
res.status(status).send(data);
})
.then(({ data }) => {
res.send(data);
});
});
问题内容: 我正在尝试通过带有POST请求的照片上传 根据自述文件,我应该能够做到这一点 问题是,这不起作用。我收到测试服务器的回复,说它转储了0个post变量。 我已经确认该HTML小页面服务器处于工作状态 所以问题是,请求模块在做什么?有没有更好的方法来发送节点? 问题答案: 经过更多研究后,我决定使用。这使得分段上传非常容易。
问题内容: 在Apache Commons HttpClient的3.x版本中,可以进行multipart / form-data POST请求(2004年的示例)。不幸的是,这在HttpClient的4.0版本中不再可能。 对于我们的核心活动“ HTTP”,多部分内容超出了范围。我们很乐意使用由其他项目维护的多部分代码,但我对此一无所知。几年前,我们曾尝试将多部分代码移至commons编解码器,
我有一个Web服务,它使用Spring Rest Controller(使用Netty而不是Apache Tomcat)处理GET/POST/PUT HTTP请求。我希望过滤我服务中的所有请求,当请求配置了特定的标头时,我希望将此特定请求发送到一个完全不同的URL,同时将响应返回到发送原始请求的相同实体。 这是我的代码: 在这个实现中,请求只是传递给我的普通rest控制器,而不会到达其他服务。我错
问题内容: 我有以下POST请求表格(简化): 我尝试发送POST请求: 但它返回状态并带有以下注释: 请指出我的错误。我应该进行哪些更改才能使其正常工作? 问题答案: 您自己设置标题,包括边界。不要这样 会为您生成一个边界并将其设置在标头中,但是如果您 已经 设置了标头,那么生成的有效负载和标头将不匹配。只需将标题全部放下即可: 请注意,我还给了零件一个文件名(路径的基本名称)。 有关多部分PO
问题内容: 我在用Java应用程序服务器处理multipart / form-data请求时非常困难。从我发现的情况来看,servlet 3.0规范提供了诸如HttpServletRequest.getParts()之类的方法,这对于处理上传到我的servlet的表单数据是理想的。 但是,此方法是3.0 Servlet规范的一部分,并且我的应用程序服务器(Tomcat 6)尚不支持此方法。即使具有
问题内容: 我们想将图像文件作为multipart / form发送到后端,我们尝试使用html表单获取文件并将文件作为formData发送,这是代码 后端中的错误是 “嵌套异常为org.springframework.web.multipart.MultipartException:无法解析多部分servlet请求;嵌套异常为java.io.IOException:org.apache.tomc