什么是 XMLHttpRequest.send(file) 的 Fetch API 等价物?

Posted

技术标签:

【中文标题】什么是 XMLHttpRequest.send(file) 的 Fetch API 等价物?【英文标题】:What is the Fetch API equivalent of XMLHttpRequest.send(file)? 【发布时间】:2016-08-04 22:20:19 【问题描述】:

我正在尝试将客户端从 XMLHttpRequest 重构为旧后端,以改用 Fetch API,但我很难弄清楚下面代码中与 xhr.send(file) 等效的 Fetch API 是什么。

input.addEventListener('change', function(event) 
  var file = event.target.files[0];
  var url = 'https://somedomain.com/someendpoint';
  var xhr = new XMLHttpRequest();
  xhr.open('POST', url, true);
  xhr.setRequestHeader('Content-Type', 'image/jpeg');
  xhr.send(file);

【问题讨论】:

【参考方案1】:

这可以这样完成:

var input = document.querySelector('input[type="file"]')

var data = new FormData()
data.append('file', input.files[0])

fetch('/avatars', 
  method: 'POST',
  body: data
)

https://github.com/github/fetch

https://developer.mozilla.org/en-US/docs/Web/API/FormData

【讨论】:

这是我在许多互联网站点上找到的方式,但并不等同。我已经尝试过了,但它不起作用。然而,Stas Malolepszy 的解决方案确实如此。【参考方案2】:

fetch 可以采用second argument、init,指定请求的高级选项。特别是,您可以指定 methodbody 选项:

fetch(url, 
  method: 'POST',
  headers: new Headers(
    "Content-Type": "image/jpeg",
  ),
  body: file,
)

您也可以将相同的选项传递给Requestconstructor。

body 必须是 Blob、BufferSource、FormData、URLSearchParams 或 USVString 对象。幸运的是,File 对象只是一种特殊的 Blob,可以使用everywhere where Blobs are accepted。

【讨论】:

你赢了!非常感谢。

以上是关于什么是 XMLHttpRequest.send(file) 的 Fetch API 等价物?的主要内容,如果未能解决你的问题,请参考以下文章

异步 XMLHttpRequest send() 在所有数据发送之前返回?

XMLHttpRequest.send()发送Blob二进制数据,serverlet中如何接收?

服务工作者:获取请求时检索 xhr 正文

FormData使用教程

ajax如何请求python接口

Java实现文件导出过程中的提示功能