创建一个使用多部分表单数据发送响应的 Nodejs 服务器

Jin*_*ing 2 multipartform-data node.js

有很多关于如何使用多部分表单数据处理请求的帖子。但是我的用例是我有一个客户端,它期望来自服务器的多部分表单数据响应,我需要编写一个简单的 nodejs 服务器来测试我的客户端。

要编写简单的服务器,我有以下内容:

var express = require('express');
var bodyParser = require('body-parser');
var FormData = require('form-data');

var app = express();

app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());


app.get('/describe', function(req, res) {
  var form = new FormData();
  form.append('part1', 'part 1 data');
  form.append('part2', 'part 2 data');
  res.setHeader('Content-Type', 'multipart/form-data');
  res.send(form);
});

app.listen(3030, "0.0.0.0");
console.log('Listening on port 3030...');
Run Code Online (Sandbox Code Playgroud)

现在,当我的客户端请求 localhost:3030/describe 时,响应头显示以下不带边界值的内容

Content-Type: multipart/form-data; charset=utf-8 
Run Code Online (Sandbox Code Playgroud)

并且内容作为文件而不是在响应正文中下载。

{"_overheadLength":208,"_valueLength":22,"_valuesToMeasure":[],"writable":false,"readable":true,"dataSize":0,"maxDataSize":2097152,"pauseStreams":true,"_released":false,"_streams":["----------------------------315683163006570790405079\r\nContent-Disposition: form-data; name=\"part1\"\r\n\r\n","part 1 data",null,"----------------------------315683163006570790405079\r\nContent-Disposition: form-data; name=\"part2\"\r\n\r\n","part 2 data",null],"_currentStream":null,"_boundary":"--------------------------315683163006570790405079"}
Run Code Online (Sandbox Code Playgroud)

所以我的问题: 1. 我们如何让边界出现在响应头中?2.我们如何让表单数据响应内容显示在响应正文中而不是作为下载文件?

Dav*_*784 8

要发送表单数据,您需要对其进行管道传输(请参阅文档),如下所示:

form.pipe(res);
Run Code Online (Sandbox Code Playgroud)

要将边界添加到标题中,您可以执行以下操作:

res.setHeader('Content-Type', 'multipart/form-data; boundary='+form.getBoundary());
Run Code Online (Sandbox Code Playgroud)

现在,关于“另存为”框:浏览器使用内容类型来确定如何处理文件。因此,如果您希望它显示在浏览器窗口中,那么一个不错的选择是text/plain(或者text/html如果这不起作用)。然后你可以把你的multipart/form-data变成类似x-content-type.

(我假设最终您将使用 XHR 或 fetch,此时您可以切换content-type回来。这text/plain只是让数据显示在标准 Web 浏览器中进行测试的临时解决方案。)

把它们放在一起:

app.get('/describe', function(req, res) {
  var form = new FormData();
  form.append('part1', 'part 1 data');
  form.append('part2', 'part 2 data');
  res.setHeader('x-Content-Type', 'multipart/form-data; boundary='+form._boundary);
  res.setHeader('Content-Type', 'text/plain');
  form.pipe(res);
});
Run Code Online (Sandbox Code Playgroud)

  • @Jing 不客气……如果有机会,您介意点赞并接受答案吗? (2认同)