7.11 Golang 下载文件

这里使用net/http下载文件,可以设置Content-Type(具体参考)告诉客户端返回的内容类型实际上是什么,实现不同方式的文件的下载。

示例一

  1. package main
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "net/http"
  6. "net/url"
  7. "os"
  8. )
  9. func main() {
  10. http.HandleFunc("/", downloadHandler) // 设置访问路由
  11. http.ListenAndServe(":8080", nil)
  12. }
  13. func downloadHandler(w http.ResponseWriter, r *http.Request) {
  14. r.ParseForm() //解析url传递的参数,对于POST则解析响应包的主体(request body)
  15. //注意:如果没有调用ParseForm方法,下面无法获取表单的数据
  16. fileName := r.Form["filename"] //filename 文件名
  17. path := "/data/images/" //文件存放目录
  18. file, err := os.Open(path + fileName[0])
  19. if err != nil {
  20. fmt.Println(err)
  21. return
  22. }
  23. defer file.Close()
  24. content, err := ioutil.ReadAll(file)
  25. fileNames := url.QueryEscape(fileName[0]) // 防止中文乱码
  26. w.Header().Add("Content-Type", "application/octet-stream")
  27. w.Header().Add("Content-Disposition", "attachment; filename=\""+fileNames+"\"")
  28. if err != nil {
  29. fmt.Println("Read File Err:", err.Error())
  30. } else {
  31. w.Write(content)
  32. }
  33. }

访问

http://localhost:8080/?filename=image.png

image.png 为你服务器上文件名称

如想直接显示图片文件或下载文件的话,也可以用http.ServeFile()

示例二

  1. package main
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "net/http"
  6. "net/url"
  7. "os"
  8. )
  9. func main() {
  10. http.HandleFunc("/", downloadHandler) // 设置访问路由
  11. http.ListenAndServe(":8080", nil)
  12. }
  13. func downloadHandler(w http.ResponseWriter, r *http.Request) {
  14. r.ParseForm() //解析url传递的参数,对于POST则解析响应包的主体(request body)
  15. //注意:如果没有调用ParseForm方法,下面无法获取表单的数据
  16. fileName := r.Form["filename"] //filename 文件名
  17. path := "/data/images/" //文件存放目录
  18. http.ServeFile(w, r, path+fileName[0])
  19. }

links

  • 目录
  • 上一节:
  • 下一节: