typescript 使用字符串正文发送多部分窗体

mwkjh3gx  于 2022-12-24  发布在  TypeScript
关注(0)|答案(1)|浏览(117)

我已经看到了几乎所有与此相关的答案,建议在nodejs中使用FormData的某个变体来构建多部分表单。
我希望不使用FormData库也能达到同样的效果,而只使用请求头和请求主体的字符串。
只有one answer提示了如何实现这一点,但是该解决方案在字符串有效负载上使用了一个stringify函数,所以我不确定正确的字符串化主体应该是什么样子。
不管怎么样,我已经走到这一步了;

import { RequestOptions } from "http"

const path: 'url/'
const method: 'POST'

const body = `--BOUNDARY
\nContent-Disposition: form-data; name="file"; filename="test.txt"
\nContent-Type: text/plain
\nThis is the content of the file
\n--BOUNDARY
\nContent-Disposition: form-data; name="form-field-one"
\nexample1
\n--BOUNDARY
\nContent-Disposition: form-data; name="form-field-two"
\nexample2
\n--BOUNDARY--`

const headers = {
  'content-type': 'multipart/form-data; boundary=BOUNDARY',
  'content-length': String(Buffer.byteLength(body))
}

const options = {
  path,
  method,
  headers,
  body
}

const response = await execute(options)

我不能创建一个完全最小化的复制,因为我不被允许发布execute函数的内容,但是我可以描述我需要使用的函数签名(这就是为什么我需要使用字符串方法)。
不管怎样,我认为这个函数只是使用了基本的内置nodejsx 1 m2n1x库。

import { RequestOptions } from "http"

const execute = async (options: RequestOptions): Promise<any> => { ... }

我得到了一个错误使用这个,但错误是没有帮助的,在所有由于内部的函数。
无论如何,我相信只使用POST请求的主体和头部,而不使用额外的库来转换主体数据,就可以复制发送多部分表单(包含文件和表单字段)。
我的字符串是一个成功的Postman请求多部分表单请求的修改输出。
有人能指出我做错了什么吗?

llmtgqce

llmtgqce1#

几点:

  • ...中的每一行都以换行符结束,但下一行以\n开始,这又增加了一个换行符,导致不需要的空行。
  • 你 * 确实 * 需要在标题和内容之间有一个空行。
  • 行必须以CRLF结尾,因此必须添加\r作为每行的最后一个字符。

试试这个:

const body = `--BOUNDARY\r
Content-Disposition: form-data; name="file"; filename="test.txt"\r
Content-Type: text/plain\r
\r
This is the content of the file\r
--BOUNDARY\r
Content-Disposition: form-data; name="form-field-one"\r
\r
example1\r
--BOUNDARY\r
Content-Disposition: form-data; name="form-field-two"\r
\r
example2\r
--BOUNDARY--`

相关问题