go文件服务器

package main

import (
	"fmt"
	"io"
	"net/http"
	"net/url"
	"os"
)

func main() {
	http.HandleFunc("/", downloadHandler) //   设置访问路由
	http.ListenAndServe(":8011", nil)
}
func downloadHandler(w http.ResponseWriter, r *http.Request) {
	r.ParseForm() //解析url传递的参数,对于POST则解析响应包的主体(request body)
	//注意:如果没有调用ParseForm方法,下面无法获取表单的数据
	fileName := r.Form["filename"] //filename  文件名
	path := "/root/project-go/"        //文件存放目录
	file, err := os.Open(path + fileName[0])
	if err != nil {
		fmt.Println(err)
		return
	}
	defer file.Close()
	// 从go1.16开始,ioutil包已被声明废弃,请换用io包以及os包中的函数代替
	//content, err := ioutil.ReadAll(file)
	content, err := io.ReadAll(file)
	fileNames := url.QueryEscape(fileName[0]) // 防止中文乱码
	w.Header().Add("Content-Type", "application/octet-stream")
	w.Header().Add("Content-Disposition", "attachment; filename=\""+fileNames+"\"")

	if err != nil {
		fmt.Println("Read File Err:", err.Error())
	} else {
		w.Write(content)
	}
}

func downloadHandler2(w http.ResponseWriter, r *http.Request) {
	r.ParseForm() //解析url传递的参数,对于POST则解析响应包的主体(request body)
	//注意:如果没有调用ParseForm方法,下面无法获取表单的数据
	fileName := r.Form["filename"] //filename  文件名
	path := "/root/project-go/"        //文件存放目录
	http.ServeFile(w, r, path+fileName[0]) // 浏览器访问是直接打印而不是下载
}

posted @ 2021-12-14 16:10  1769987233  阅读(166)  评论(0编辑  收藏  举报