javascript - 在 Node js 后端使用 FormData 和 XmlHttpRequest 上传文件并使用 Formidable 显示空文件、字段

标签 javascript node.js xmlhttprequest fetch-api formidable

我正在使用 FormData 和 XmlHttpRequest 上传 csv 文件。这是代码。 我有一个包含 html 输入类型文件的表单,我正在执行该代码的 onchange 事件。我也尝试过直接发送表单,并将表单元素读入 FormData 对象。

      let formData = new FormData();
      let file = e.target.files[0];
      var blob = new Blob([file],{type: 'text/csv'});
      formData.append("payoutUpload", blob, 'processed.csv');

      let uri = encodeURI(`${window.serviceUri}${path}`);

      var req = new XMLHttpRequest();
      req.onload = (result) => {
        if (req.status === 500 && result && result.code === 'ECONNRESET') {
          console.log(
            'Connection was reset, hence retry the sendRequest function'
          );
        } else if (req.status === 200) {

        } else {
          console.log("Error while retrieving data");
        }
      }
      req.onerror = (e) => {
        console.log('There was an error while retrieving data from service', e);
      };
      req.open('POST', uri, true);
      req.setRequestHeader('Content-Type', 'multipart/form-data');
      req.setRequestHeader('Authorization', 'Bearer ' + token);
      req.send(formData);

当我发送请求时,我可以看到文件正在以请求负载的形式发送。

在 NodeJs 后端,我运行 Express 和 Formidable。我没有使用 body-parser,我使用的是 Express 内置的 json 和 urlencoding 方法。

这是最可怕的部分。

const form = formidable({multiples: true});
form.parse(req, (err, fields, files) => {
    console.log(`error is ${JSON.stringify(err)}`);
    console.log(`fields is ${JSON.stringify(fields)}`);
    console.log(`files JSON: ${JSON.stringify(files)}`);
    console.log('file in request: ' + files.payoutUpload);
    console.log(`req.body: ${req.body}`);
    options.file = files.payoutUpload;
});

我收到错误,字段和文件为空。我已经搜索了所有类似的问题并正确设置了请求 header (这通常是问题)。我可以看到 request.body 在服务器端仍然有文件负载。但强大并没有解析这个。谁能告诉我我做错了什么?

更新:我尝试过其他软件包来解析文件,例如 multer、express-fileupload,它们都将文件返回为空。我也尝试过 fetch API 来发送我的请求,但没有成功。

最佳答案

req.setRequestHeader('Content-Type', 'multipart/form-data')

当您发送multipart/form-data时,您必须在 header 中包含boundary参数,但不能 知道您需要为此设置什么值。

根本不要设置Content-Type header 。允许 XMLHttpRequestFormData 对象自动生成它。

关于javascript - 在 Node js 后端使用 FormData 和 XmlHttpRequest 上传文件并使用 Formidable 显示空文件、字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68508027/

相关文章:

javascript - 如何使用 JS 编辑 CSS 变量?

javascript - 更改 html 字符串宽度

javascript - 在 Markdown 服务器或客户端中格式化? Node js

javascript - 浏览器偶尔中止 Ajax 请求而不返回任何错误

javascript - 在 Node.js 中混合使用 JavaScript 和 TypeScript

javascript - Webpack 不会将我使用的图像复制到 react 组件中

javascript - 删除 XML 消息

javascript - 如何使用在事件中声明的参数进行回调

javascript - 使用 OR 对多对多搜索进行序列化

node.js - 当我输入 'npm start' 将我的网站与本地主机连接时出现错误