JavaScript中计算HTTP Content-Length头部的方法

3

我是javascript和node-js的新手。在调用rest端点时出现了问题。我的问题是当我使用Postman调用端点时一切正常。我可以在Postman控制台中看到计算出的Content-Length头信息。但是当我尝试在javascript中调用同一个端点时,出现了一些问题,因为计算出的Content-Length比Postman计算的稍微低一些。以下是我使用的node.js代码来调用端点。请注意,该API是用于上传文件的多部分API。

file = fs.readFileSync('/Users/.../Documents/doc.pdf')
form = new FormData()
form.append('file', file)
headers = Object.assign({'Content-Length': form.getLengthSync() }, form.getHeaders())
config = {
    method: 'post',
    url: 'https://staging:...',
    headers: headers,
    data : form
};
axios(config).then((res) ->
        console.log("The file is posted successfully. status is : " + res.status)
    ).catch((err) -> 
        console.log("The error occurred in posting file : " + err)
    )

请问这里缺什么?例如,对于我正在测试的特定文件,Postman 计算的值为 388,但是代码计算出的值相同文件为 379。 注意:当我使用 Postman 中的值硬编码时,一切正常。

1个回答

2
在form-data代码库的第426个问题中似乎描述了解决您问题的方法。
我在本地尝试并通过应用问题所描述的方法成功实现了期望的结果。
const filePath = '/Users/.../Documents/doc.pdf';
const form = new FormData();
let options = {
  knownLength: fs.statSync(filePath).size
}
form.append(
  'file',
  fs.createReadStream(filePath),
  options,
);

我了解到这个问题与在getLengthSync规范中所做的声明有关,该规范指出流长度未被计算,因此必须采取额外步骤才能向FormData实例提供正确的文件长度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接