首页 > 其他分享 >一对一视频app开发,如何分块加载大文件?

一对一视频app开发,如何分块加载大文件?

时间:2024-01-27 14:11:41浏览次数:26  
标签:const 分块 app ctx SIZE 加载

一对一视频app开发,如何分块加载大文件?

后端:使用 Koa2 实现分块传输

首先,在一对一视频app开发中,我们需要设置后端以支持分块传输编码。以下是使用 Koa2 的示例代码:

const Koa = require("koa");
const fs = require("fs");
const app = new Koa();

app.use(async (ctx) => {
  const filePath = "./large-article.txt"; // 你的大文件路径
  const CHUNK_SIZE = 10000; // 设定每个分块的大小(例如,1 万字)
  const fileSize = fs.statSync(filePath).size;

  // 设置响应头以支持分块传输编码
  ctx.set("Content-Type", "text/plain");
  ctx.set("Transfer-Encoding", "chunked");
  ctx.set("Content-Length", fileSize);

  // 通过 Koa 的 Readable Stream 逐个发送分块
  ctx.body = fs.createReadStream(filePath, { highWaterMark: CHUNK_SIZE });
});

app.listen(3000, () => {
  console.log("Server is running on port 3000");
});

 

在这个示例中,我们首先设置 Koa2 以支持分块传输编码。然后,我们使用 Node.js 的 fs 模块创建一个可读流,将大文件分成每个 CHUNK_SIZE 大小的块,并将其作为 Koa 的响应体。

前端:使用 React 实现分块加载

接下来,我们需要在 React 应用中实现分块加载。以下是一个简单的 React 组件示例:

import React, { useEffect, useState } from "react";

const CHUNK_SIZE = 10000; // 1万字
const articleUrl = "http://localhost:3000"; // 替换为你的后端地址

function LargeArticle() {
  const [articleContent, setArticleContent] = useState("");

  useEffect(() => {
    fetchArticleInChunks();
  }, []);

  async function fetchArticleInChunks() {
    const response = await fetch(articleUrl);

    if (!response.body) {
      throw new Error("ReadableStream not yet supported in this browser.");
    }

    const reader = response.body.getReader();
    let result = "";
    let receivedLength = 0;

    while (true) {
      const { done, value } = await reader.read();

      if (done) {
        break;
      }

      receivedLength += value.length;
      const chunk = new TextDecoder("utf-8").decode(value);

      // 处理新接收到的文章部分
      processChunk(chunk);

      // 更新进度
      console.log(`Received ${receivedLength} of ${response.headers.get("Content-Length")} bytes`);

      // 如果已经加载了足够的内容,你可以根据需要停止加载
      if (receivedLength >= CHUNK_SIZE) {
        reader.cancel();
        break;
      }
    }
  }

  function processChunk(chunk) {
    // 在这里处理接收到的文章部分,例如,将其插入到 DOM 中
        setArticleContent((prevContent) => prevContent + chunk);
  }

  return (
    <div>
      <h1>Large Article</h1>
      <div>{articleContent}</div>
    </div>
  );
}

export default LargeArticle;

 

在这个 React 组件中,我们首先定义了一个 articleContent 状态,用于存储从后端接收到的文章内容。然后,我们使用 useEffect 钩子在组件挂载时调用 fetchArticleInChunks 函数,该函数负责发起 fetch 请求并处理分块响应。
与前面的示例类似,我们使用 ReadableStream API 逐个读取响应中的块,并在接收到足够的数据时停止加载。在 processChunk 函数中,我们将接收到的文章部分添加到 articleContent 状态中。
最后,我们在组件的渲染函数中显示加载到的文章内容。

以上就是一对一视频app开发,如何分块加载大文件?, 更多内容欢迎关注之后的文章

 

标签:const,分块,app,ctx,SIZE,加载
From: https://www.cnblogs.com/yunbaomengnan/p/17991377

相关文章

  • 无涯教程-Scala - Partially Applied Functions函数
    调用函数时,据说是将函数应用于参数。如果传递所有期望的参数,则说明已完全应用了它。如果仅发送几个参数,则将返回部分应用的函数。这使您可以方便地绑定一些参数,并在以后填充其余参数。尝试以下操作,它是显示部分应用功能的简单示例程序-例importjava.util.Dateobject......
  • 微信小程序中使用Vant Weapp组件库
    【快速上手-VantWeapp(gitee.io)】【node版本对应的npm版本表-菜小鱼~-博客园(cnblogs.com)】【报错npmERR!Acompletelogofthisruncanbefoundin:npmERR!-CSDN博客】【解决:npminstall报错‘Theoperationwasrejectedbyyouroperatingsystem‘-C......
  • 图片懒加载
    依赖jquery第一个函数:计算图片是否出现和消失在可视区functionisVisible(ele){leteleTop=ele.offset().top;leteleHeight=ele.outerHeight(true);letwinScrollTop=$(window).scrollTop();letwinHeight=$(window).height();letvisible=......
  • linux服务器,启动服务jar包后,tail查看日志会卡主几分钟后,日志才加载出来,且访问接口很容
    首先:先排除服务器资源不足问题,看程序启动分配内存是否充足等问题原因:DNS配置异常导致的问题,程序运行时会去跑这些域名解析解决方法:/etc/resolv.conf中namespace配置注释,配置注释后,不用运行其他命令,会立即生效,重启服务,可以看到日志会立即返回,且调接口会快速返回,不容易超时......
  • CSAPP-C3
    0.警告不要试图通过这篇意识流笔记自学。右转睿站九曲阑干,可以帮你快速建立基本概念。1.基本的汇编语法I.数据格式三种数据类型:立即数:常数,一般用十进制表示,如果要使用十六进制表示,在前面加上$寄存器:寄存器内存:把内存抽象成一个大数组,使用M[i]的形式来理解i地址指......
  • Element ui table表格实现触底加载更多数据
    Elementuitable代码<el-table   header-align="center"   v-loadmore="addData"   :data="myData"   height="300"   v-loading="loading"   style="width:100%"   class=&......
  • call方法,apply方法,和arguments对象
    //1.call方法//2.apply方法//3.arguments对象functionadd(a,b){console.log(a+b);}add(1,2);//call方法第一个参数是this指针,即调用者,第二个参数开始,就是原函数的实际参数add.call(null,10,20);//apply方法第一个参数是this指针,即调用者,第二个参数是一......
  • Android真机调试遇到The application could not be installed: INSTALL_FAILED_NO_MAT
    先说下编译环境AndroidStudio 2023.1.1gredle8.0sdk32kotlin1.8.10 最近开发地图功能的时候,需要用到真机环境的定位设备,所以需要进行真机调试。连上手机后,点击调试总是提示INSTALL_FAILED_NO_MATCHING_ABIS这个错误。但是我直接将编译好的release.apk拷贝到真机上又......
  • 使用命令行方式搭建uni-app + Vue3 + Typescript + Pinia + Vite + Tailwind CSS + uv
    使用命令行方式搭建uni-app+Vue3+Typescript+Pinia+Vite+TailwindCSS+uv-ui开发脚手架项目代码以上传至码云,项目地址:gitee.com/breezefaith…目录一、前言近日心血来潮想做一个开源项目,目标是做一款可以适配多端、功能完备的模板工程,包含后台管理系统和前台......
  • uniapp左滑删除
    在本页面引入组件并使用在需要左滑删除的地方使用<viewv-for="(item,index)incsListArrl":key="index":data-index="index"><delSlideLeft:item="item":data_transit="{index:index,item:item}"@delItem="......