golang 文件上传,上传下载速度限制
青苗 | 749 |
2022-11-16
文件上传,大小写获取
package main
import (
"fmt"
"io"
"log"
"net/http"
"os"
)
// 获取文件大小的接口
type Size interface {
Size() int64
}
// 获取文件信息的接口
type Stat interface {
Stat() (os.FileInfo, error)
}
// hello world, the web server
func HelloServer(w http.ResponseWriter, r *http.Request) {
if "POST" == r.Method {
file, _, err := r.FormFile("userfile")
if err != nil {
http.Error(w, err.Error(), 500)
return
}
if statInterface, ok := file.(Stat); ok {
fileInfo, _ := statInterface.Stat()
fmt.Fprintf(w, "上传文件的大小为: %d", fileInfo.Size())
}
if sizeInterface, ok := file.(Size); ok {
fmt.Fprintf(w, "上传文件的大小为: %d", sizeInterface.Size())
}
return
}
// 上传页面
w.Header().Add("Content-Type", "text/html")
w.WriteHeader(200)
html := `
<form enctype="multipart/form-data" action="/hello" method="POST">
Send this file: <input name="userfile" type="file" />
<input type="submit" value="Send File" />
</form>
`
io.WriteString(w, html)
}
func main() {
http.HandleFunc("/hello", HelloServer)
err := http.ListenAndServe(":12345", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
上传下载速度限制
package main
import (
"bytes"
"fmt"
"io"
"time"
"wego/util/ratelimit"
)
type writer struct {
}
func (w *writer) Write(p []byte) (n int, err error) {
time.Sleep(time.Second / 5) // 模拟网络传输消耗的时间
return len(p), nil
}
func main() {
// 源数据 1000 KB
// 实验用的源数据不建议太大,因为io.Copy内部一次copy 32KB,源数据太大导致copy次数过多影响实验效果
// 就像本来网速支持每秒10KB,你用ratelimit限制100KB每秒是完全没效果的
src := bytes.NewReader(make([]byte, 1000*1024))
// 模拟客户端
dst := &writer{}
// new 一个速度限制器,每秒传输 100 Kb
bucket := ratelimit.New(100 * 1024)
start := time.Now()
// 大概需要 10s 传输完
//n, err := io.Copy(dst, ratelimit.Reader(src, bucket))
n, err := io.Copy(ratelimit.Writer(dst, bucket), src)
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("Copied %d bytes in %s\n", n, time.Since(start))
// 输出:
// Copied 1024000 bytes in 10.2005835s
// 多出来的 0.2s 其实是最后一次 write 消耗的时间
}
限制上传文件类型
//接收文件流并存储到本地
func (c *FileUploadController) FileHandler() {
//获取上传的文件
file, head, _ := c.GetFile("fileupload")
ext := path.Ext(head.Filename)
//限制上传文件类型
var FileAllow map[string]bool = map[string]bool{
".jpg": true,
".txt": true,
".png": true,
".go": true,
}
if _, ok := FileAllow[ext]; !ok {
c.Ctx.WriteString("文件后缀名不符合上传要求")
return
}
defer file.Close()
err:=c.SaveToFile("fileupload","static/upload/"+head.Filename)
if err != nil {
c.Ctx.WriteString("上传文件失败")
}
c.Ctx.WriteString("上传文件成功")
}
推荐指数:
真诚点赞 诚不我欺~