登录
首页 >  Golang >  Go问答

Golang实现http服务文件限流下载功能?

来源:Golang技术栈

时间:2023-03-03 19:01:10 306浏览 收藏

Golang小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《Golang实现http服务文件限流下载功能?》带大家来了解一下Golang实现http服务文件限流下载功能?,希望对大家的知识积累有所帮助,从而弥补自己的不足,助力实战开发!


问题内容

Golang实现http服务文件限流下载功能?

正确答案

package main

import (
	"fmt"
	"io"
	"net/http"
	"os"
	"strconv"
	"time"
)

//http 文件下载 限速下载
func main() {
	http.HandleFunc("/", download)
	//启动
	err := http.ListenAndServe("127.0.0.1:8080", nil)
	fmt.Println(err)
}

func download(res http.ResponseWriter, req *http.Request) {

	filename := "ubuntu-20.04-live-server-amd64.iso"

	//读取服务器端文件
	file, err := os.Open(filename)
	if err != nil {
		panic(err)
	}
	defer file.Close()

	//读取文件头部信息
	fileHeader := make([]byte, 512)
	file.Read(fileHeader) //取出文件头部信息

	fileStat, _ := file.Stat()
	//定义响应头
	res.Header().Set("Content-Disposition", "attachment; filename="+filename)  //返回文件名
	res.Header().Set("Content-Type", http.DetectContentType(fileHeader))       //返回检测到的文件类型
	res.Header().Set("Content-Length", strconv.FormatInt(fileStat.Size(), 10)) //返回文件大小

	//把文件读取指针归零
	file.Seek(0, 0)
	//io.Copy(res, file)
	for {
		tmp := make([]byte, 100000) //通过切片长度控制流速
		n, err := file.Read(tmp)
		if err == io.EOF {
			return
		}
		res.Write(tmp[:n])
		time.Sleep(time.Microsecond * 1) //通过sleep时间控制流速
	}
}

好了,本文到此结束,带大家了解了《Golang实现http服务文件限流下载功能?》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>