首页 > 其他分享 >浏览器接口 fetch 发起的请求如何跟踪上传进度?

浏览器接口 fetch 发起的请求如何跟踪上传进度?

时间:2024-01-05 13:05:19浏览次数:31  
标签:浏览器 fetch ReadableStream file const 上传 response


在使用浏览器接口`fetch`发起请求时,你可以利用`ReadableStream`对象的`onprogress`事件来跟踪上传进度。`fetch`函数返回的是一个`Promise`对象,可以通过调用`response.body.getReader()`获取到`ReadableStream`,然后通过监听`onprogress`事件来获取上传进度信息。

以下是一个示例代码,演示了如何使用`fetch`和`ReadableStream`来跟踪上传进度:

function trackUploadProgress(url, file) {
  return new Promise((resolve, reject) => {
    const reader = file.stream().getReader();
    const totalSize = file.size;
    let uploadedSize = 0;

    fetch(url, {
      method: 'POST',
      body: file
    }).then(response => {
      if (!response.ok) {
        throw new Error('Upload failed');
      }
      resolve(response);
    }).catch(error => {
      reject(error);
    });

    reader.read().then(function processChunk({ done, value }) {
      if (done) {
        return;
      }

      uploadedSize += value.length;
      const progress = (uploadedSize / totalSize) * 100;
      console.log(`Upload progress: ${progress.toFixed(2)}%`);

      return reader.read().then(processChunk);
    });
  });
}

// 使用示例
const fileInput = document.getElementById('fileInput');
const uploadButton = document.getElementById('uploadButton');

uploadButton.addEventListener('click', () => {
  const file = fileInput.files[0];
  const uploadUrl = 'http://example.com/upload';

  trackUploadProgress(uploadUrl, file).then(response => {
    console.log('Upload completed:', response);
  }).catch(error => {
    console.error('Upload failed:', error);
  });
});

在上面的示例中,`trackUploadProgress`函数接受一个URL和一个文件对象,并返回一个Promise对象。在函数内部,我们首先获取到文件的`ReadableStream`对象,并记录上传文件的总大小`totalSize`。然后,通过`fetch`函数发起POST请求并上传文件。在`reader.read().then()`的回调函数中,我们按块读取文件的内容,累计已上传的大小`uploadedSize`并计算上传进度。最后,我们通过`resolve`和`reject`方法来处理Promise的结果。

你可以根据具体需求,将示例代码中的URL、文件对象以及上传完成后的处理逻辑进行修改。通过使用`ReadableStream`的`onprogress`事件,你可以实时跟踪上传进度,从而提供上传进度的反馈给用户。

标签:浏览器,fetch,ReadableStream,file,const,上传,response
From: https://blog.51cto.com/M82A1/9112819

相关文章

  • 如何将视频上传到可用于HTML5 <video> 标签的 'src' 属性的平台?
    要将视频上传到可用于HTML5<video>标签的'src'属性的平台,您需要遵循以下步骤:1.选择一个支持视频上传的平台,例如YouTube、Vimeo或自建服务器。2.注册并登录到所选平台。3.创建一个新的视频项目或上传您的视频文件。4.获取视频的嵌入代码或URL。这通常可以在平台的......
  • Python武器库开发-武器库篇之上传本地仓库到Git(三十八)
    武器库篇之上传本地仓库到Git(三十八)当我们在Git中创建远程仓库和进行了SSHkey免密登陆之后,我们点击Yourrespositories可以查看我们所创建的远程仓库,如图所示:如果我们需要将本地的仓库上传到Git,首先我们需要建立一个本地的仓库,我们创建一个和远程仓库同名的本地仓库,然后进入这......
  • 【Azure APIM】APIM 策略语句如何来设置多个Cookie值让浏览器保存
    问题描述在APIM的 <return-response>策略中,设置Cookie值,因为需要设置多个Cookie值,使用下面两种方式都只能保存一个Cookie值:方式一:把多个cookie值用分号(;)拼接<return-response><set-statuscode="201"/><set-headername="Set-Cookie"exists-actio......
  • Mongo Express web浏览器直观界面 管理和操作MongoDB数据库
    MongoExpress是一个基于Web的MongoDB管理员界面工具,使用Node.js和express编写。它提供了一个直观的界面,帮助用户轻松管理和操作MongoDB数据库MongoExpress是一个基于Web的MongoDB管理员界面工具,使用Node.js和express编写。它提供了一个直观的界面,帮助用户轻松管理和操作MongoDB......
  • uniapp:全局消息是推送,实现app在线更新,WebSocket,apk上传
    全局消息是推送,实现app在线更新,WebSocket1.在main.js中定义全局的WebSocket2.java后端建立和发送WebSocket3.通知所有用户更新背景:开发人员开发后app后打包成.apk文件,上传后通知厂区在线用户更新app。那么没在线的怎么办?因为我们在上一篇博客中写了,在app打开的时候回去校验是否......
  • HTML5 文件上传的2种方式
    以前上传文件需要提交Form表单。HTML5方式上传文件,可以通过使用FormData类模拟Form表单提交,从而实现无刷新上传文件。 假设有一个文件选择框<inputtype="file"name="pic"id="pic"accept="image/gif"/>有下面2种方式上传文件:1、XMLHttpRequest(有进度事件)varfiles=document.......
  • html5实现文件批量上传组件
    一、概述在html5中,相对于之前添加了不少新的元素和属性,在javascript中也添加了一些新的API,这些给我们的开发带来了很多便利。但由于各浏览器的发展步骤不一致,也导致了不同浏览器对html5支持的差异性。 二、实现原理1.在该html5实现的文件批量上传组件中,我们主要是利用html5中的一......
  • 使用HTML5实现多文件上传
    入门Fileinput之所以叫fileinput是因为它是一个标准的input元素,且其type属性被设置为"file"。很多年以来,fileinput一次只能选择并上传单个文件。在新的HTML5规范中为input元素添加了多选模式。当然,不同浏览器对于规范的实现一直以来都不尽相同。比如,Firefox3.6和WebKit以及Firef......
  • 影响浏览器页面展示的因素以及优化策略
    渲染流水线影响到了首次页面展示的速度,而首次页面展示的速度又直接影响到了用户体验,所以分析渲染流水线的目的就是为了找出一些影响到首屏展示的因素,然后再基于这些因素做一些针对性的调整。那么接下来我们就来看看从发起URL请求开始,到首次显示页面的内容,在视觉上经历的三个阶段......
  • 浏览器使用隧道代理HTTP:洞悉无界信息
    在信息爆炸的时代,互联网已经成为获取信息的首选渠道。然而,在某些地区或情况下,访问某些网站可能会受到限制。这时,隧道代理HTTP便成为了一个重要的工具,帮助用户突破限制,洞悉无界信息。一、隧道代理HTTP的原理与优势隧道代理HTTP是一种网络通信方式,通过建立一条虚拟的通信隧道,用户可以......