Javascript 计算formdata编码开销-多部分/表单数据(RFC 2388)

Javascript 计算formdata编码开销-多部分/表单数据(RFC 2388),javascript,html,Javascript,Html,当根据(multipart/form data)对3字节字符串“ABC”进行编码时,由例如XMLHttpRequest发送的formdata由于编码而比3字节大得多 此外,当一个100字节的文件被编码为formdata(multipart/formdata)时,由于编码的原因,实际发送的字节数约为300字节。 这是正常的,因为此编码的键/值对的头和分隔符占用空间,以及文件名等 问题:未定义formdata.size时,如何计算此编码大小 下面是我试图通过从整个编码的formdata本身的大小中减

当根据
multipart/form data
)对3字节字符串“ABC”进行编码时,由例如
XMLHttpRequest
发送的
formdata
由于编码而比3字节大得多

此外,当一个100字节的文件被编码为
formdata
multipart/formdata
)时,由于编码的原因,实际发送的字节数约为300字节。
这是正常的,因为此编码的键/值对的头和分隔符占用空间,以及文件名等

问题:未定义
formdata.size
时,如何计算此编码大小

下面是我试图通过从整个编码的
formdata
本身的大小中减去
formdata
中包含的原始对象大小之和来计算此开销


计算间接费用
,


不,在我看来,客户端没有这样的机制。它应该通过交替使用Blob/BufferSource来满足您的需求。FormData以键/值格式封装数据,这通常会导致超出您预期的一些“开销”。
XMLHttpRequest
ProgressEvent
包含一个名为
total
的只读属性,该属性似乎包含编码的
FormData
的大小,…但是,如果不实际发送数据,则不可能调用此事件。
function SumOfObjects(formdata) {
  var size = 0;
  for(var pair of formdata.entries()) {  
    if (pair[1] instanceof Blob) 
      size += pair[1].size;
    else
      size += pair[1].length;
  }

  return size;
}

function clickMe() {
  var formdata = new FormData(document.getElementById("myForm"));

  alert("Bytes taken by all raw objects= " + SumOfObjects(formdata) );
  alert("Bytes taken by the encoded formdata= " + formdata.size); //encoded as multipart/form-data (RFC 2388) - DOES NOT WORK !
  alert("Bytes of encoding Overhead= " + formdata.size - SumOfObjects(formdata) );
}