egg 实现下载

news/2024/12/4 3:41:29/

egg 最简单的下载实现如下:

async download(){const { ctx } = this;const filePath = '/path/xml'ctx.attachment('xml');ctx.set('Content-Type','application/octet-stream');ctx.boby = fs.createReadStream(filePath)
}

加入 Content-Length 支持进度条和剩余时间
仅需这样实现,即可实现下载,但这样实现的下载会发现没有下载进度条,也不知道还有多久下载完。原因 HTTP 返回头里没有 Content-Length

async download(){const { ctx } = this;const filePath = '/path/xml'const fileSize = (await promisify(stat)(filePath)).size.toString()ctx.attachment('xml');ctx.set('Content-Length', fileSize);ctx.set('Content-Type','application/octet-stream');ctx.boby = fs.createReadStream(filePath)
}

加入 Range 和 Content-Range - 支持断点续传
但这还不够,我还希望能支持断点续传,这个时候我们就需要了解一下 Range 和 Content-Range了。也就是说,在服务端我们需要处理客户端请求头中的 Range 字段,同时再返回 Content-Range。

当然这样的需求肯定有人造了轮子了,没必要自己实现。我没有找到 egg 生态的轮子,但我找到了
koa 生态中有一个中间件叫 koa-range,我们可以拿过来用。

先创建一个中间件

import * as KoaRange from 'koa-range';
export default function RangeMiddleware() {return KoaRange;
}

然后在配置中启用它:

import { EggAppConfig, EggAppInfo, PowerPartial } from 'egg
export default (appInfo: EggAppInfo) => {const config = {} as PowerPartial<EggAppConfig>;config.middleware = ['range'];return config;
};

http://www.ppmy.cn/news/544034.html

相关文章

e.target 和 e.currentTarget 的区别?

当你触发一个元素的事件的时候&#xff0c;该事件从该元素的祖先元素传递下去&#xff0c;此过程为捕获&#xff0c;而到达此元素之后&#xff0c;又会向其祖先元素传播上去&#xff0c;此过程为冒泡 addEventListener 介绍addEventListener是为元素绑定事件的方法&#xff0c;…

e.target 和 e.currentTarget 的区别

e.target 是触发事件的元素。 e.currentTarget 是绑定事件的元素。 如图&#xff0c;两个div嵌套&#xff08;黄色为parent&#xff0c;绿色为child&#xff09;&#xff0c;给parent绑定click事件。 <div class"parent" onclick"handlerClick">&l…

for_each用法示例

文章目录 前言示例demo 前言 由于偶然间发现for_each能使得避免使用for循环&#xff0c;大大简化了代码。这里简单记录下for_each的一个简单示例demo,方便温习。 示例demo #include <iostream> #include "vector" #include "algorithm"void myfun…

gets与fgets的区别

简单来说 gets——从标准输入接收一串字符&#xff0c;遇到’\n’时结束&#xff0c;但不接收’\n’&#xff0c;把 ‘\n’留存输入缓冲区&#xff1b;把接收的一串字符存储在形式参数指针指向的空间&#xff0c;并在最后自动添加一个’\0’。 getchar——从标准输入接收一个字…

getit

本逆向题还是源码分析&#xff0c;通过源码追出flag&#xff0c;下面步入正题 0x01源码分析 int __cdecl main(int argc, const char **argv, const char **envp) {char v3; // al__int64 v5; // [rsp0h] [rbp-40h]int i; // [rsp4h] [rbp-3Ch]FILE *stream; // [rsp8h] [rbp…

阶段性复习 迭代器, Lambda表达式, 泛型, 单例模式

迭代器&#xff08;Iterator&#xff09;是一种设计模式&#xff0c;用于顺序访问集合中的元素&#xff0c;而不需要了解集合内部的结构。 迭代器模式将元素的遍历行为和集合类解耦&#xff0c;使得可以在不修改集合类的情况下遍历集合。 具体来说&#xff0c;一个迭代器对…

遍历$.each()和$().each()用法

jQuery $.each(obj,function(n,value) 遍历用法 对象的遍历 js 代码部分 <script type"text/javascript">$(function() {var $tbody $("tbody");var html "";//前提必须是对象&#xff0c;一般情况下&#xff0c;后台传过来json字符串&…

$.each()和$().each(),以及forEach()的用法

1.forEach是js中遍历数组的方法&#xff0c;如下 var arr[1,2,3,4]; arr.forEach(function(val,index,arr){//val为数组中当前的值&#xff0c;index为当前值的下表&#xff0c;arr为原数组arr[index]2*val; }); console.log(arr);//结果是修改了原数组&#xff0c;为每个数乘…