打印

golang的一个文件服务器

[复制链接]
2794|14
跳转到指定楼层
楼主
可以显示指定目录,进入子目录,下载文件,上传文件等等

@sherwin @海中水 @gaoyang9992006

  1. go run fileserver.go -p=1234
复制代码



显示指定目录:





进入子目录:



上传文件:





fileserver.go
代码如下:


  1. package main

  2. import (
  3. ? ? ? ? "flag"
  4. ? ? ? ? "fmt"
  5. ? ? ? ? "io"
  6. ? ? ? ? "io/ioutil"
  7. ? ? ? ? "log"
  8. ? ? ? ? "net/http"
  9. ? ? ? ? "os"
  10. ? ? ? ? "path"
  11. ? ? ? ? "strconv"
  12. ? ? ? ? "strings"
  13. ? ? ? ? "time"
  14. )

  15. var defaultPath string

  16. var baseURL string
  17. var upload_path string

  18. func Logger(req *http.Request, statusCode int) {
  19. ? ? ? ? const layout = "[ 2/Jan/2006 15:04:05 ]"
  20. ? ? ? ? fmt.Println(baseURL + " --- " + time.Now().Format(layout) + " " + req.Method + "??" + strconv.Itoa(statusCode) + "??" + req.URL.Path)
  21. }

  22. func Handler(w http.ResponseWriter, req *http.Request) {


  23. ? ? ? ? filename := defaultPath + req.URL.Path[1:]
  24. ? ? ? ? fmt.Println("=+=== file name: ",filename)
  25. ? ? ? ? if last := len(filename) - 1; last >= 0 && filename[last] == '/' && len(filename) != 1 {
  26. ? ? ? ? ? ? ? ? filename = filename[:last]
  27. ? ? ? ? }

  28. ? ? ? ? if req.Method == "POST" {
  29. ? ? ? ? ? ? ? ? file, head, err := req.FormFile("file")
  30. ? ? ? ? ? ? ? ? if err != nil {
  31. ? ? ? ? ? ? ? ? ? ? ? ? fmt.Println(err)
  32. ? ? ? ? ? ? ? ? ? ? ? ? return
  33. ? ? ? ? ? ? ? ? }

  34. ? ? ? ? ? ? ? ? defer file.Close()


  35. ? ? ? ? ? ? ? ? //创建文件
  36. ? ? ? ? ? ? ? ? fW, err := os.Create(upload_path + head.Filename)
  37. ? ? ? ? ? ? ? ? if err != nil {
  38. ? ? ? ? ? ? ? ? ? ? ? ? fmt.Println("文件创建失败")
  39. ? ? ? ? ? ? ? ? ? ? ? ? return
  40. ? ? ? ? ? ? ? ? }
  41. ? ? ? ? ? ? ? ? defer fW.Close()

  42. ? ? ? ? ? ? ? ? _, err = io.Copy(fW, file)
  43. ? ? ? ? ? ? ? ? if err != nil {
  44. ? ? ? ? ? ? ? ? ? ? ? ? fmt.Println("文件保存失败")
  45. ? ? ? ? ? ? ? ? ? ? ? ? return
  46. ? ? ? ? ? ? ? ? }
  47. ? ? ? ? }

  48. ? ? ? ? // Empty request (Root)
  49. ? ? ? ? if filename == "" {
  50. ? ? ? ? ? ? ? ? filename = "./"
  51. ? ? ? ? }

  52. ? ? ? ? file, err := os.Stat(filename)

  53. ? ? ? ? // 404 if file doesn't exist
  54. ? ? ? ? if os.IsNotExist(err) {
  55. ? ? ? ? ? ? ? ? _, err = io.WriteString(w, "404 Not Found")
  56. ? ? ? ? ? ? ? ? Logger(req, http.StatusNotFound)
  57. ? ? ? ? ? ? ? ? return
  58. ? ? ? ? }

  59. ? ? ? ? // Serve directory
  60. ? ? ? ? if file.IsDir() {

  61. ? ? ? ? ? ? ? ? slashCheck := ""

  62. ? ? ? ? ? ? ? ? files, err := ioutil.ReadDir(filename)
  63. ? ? ? ? ? ? ? ? // Catch the Error in reading from directory
  64. ? ? ? ? ? ? ? ? if err != nil {
  65. ? ? ? ? ? ? ? ? ? ? ? ? http.Redirect(w, req, "", http.StatusInternalServerError)
  66. ? ? ? ? ? ? ? ? ? ? ? ? Logger(req, http.StatusInternalServerError)
  67. ? ? ? ? ? ? ? ? }
  68. ? ? ? ? ? ? ? ? // Checking for Root Directory
  69. ? ? ? ? ? ? ? ? if filename != "./" {
  70. ? ? ? ? ? ? ? ? ? ? ? ? if filename[len(filename)-1] != '/' {
  71. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? slashCheck = "/"
  72. ? ? ? ? ? ? ? ? ? ? ? ? }
  73. ? ? ? ? ? ? ? ? }

  74. ? ? ? ? ? ? ? ? fmt.Println("=+=== slashCheck: ",slashCheck)
  75. ? ? ? ? ? ? ? ? fmt.Println("=+=== req.URL.Path[0:]: ",req.URL.Path[0:])

  76. ? ? ? ? ? ? ? ? responseString := "

    Directory Listing for " + req.URL.Path[1:] + "/



      "
    • ? ? ? ? ? ? ? ? for _, f := range files {
    • ? ? ? ? ? ? ? ? ? ? ? ? if f.Name()[0] != '.' {
    • ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if f.IsDir() {
    • ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? responseString += "
    • " + f.Name() + "/" + "
    • "
    • ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? } else {
    • ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? responseString += "
    • " + f.Name() + "
    • "
    • ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
    • ? ? ? ? ? ? ? ? ? ? ? ? }
    • ? ? ? ? ? ? ? ? }

    • ? ? ? ? ? ? ? ? //Ending the list
    • ? ? ? ? ? ? ? ? responseString += "


    "

  77. ? ? ? ? ? ? ? ? p := req.URL.Path

  78. ? ? ? ? ? ? ? ? // Display link to parent directory
  79. ? ? ? ? ? ? ? ? if len(p) > 1 {
  80. ? ? ? ? ? ? ? ? ? ? ? ? base := path.Base(p)

  81. ? ? ? ? ? ? ? ? ? ? ? ? slice := len(p) - len(base) - 1

  82. ? ? ? ? ? ? ? ? ? ? ? ? url := "/"

  83. ? ? ? ? ? ? ? ? ? ? ? ? if slice > 1 {
  84. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? url = req.URL.Path[:slice]
  85. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? url = strings.TrimRight(url, "/") // Remove extra / at the end
  86. ? ? ? ? ? ? ? ? ? ? ? ? }

  87. ? ? ? ? ? ? ? ? ? ? ? ? responseString += "
    Parent directory"
  88. ? ? ? ? ? ? ? ? }

  89. ? ? ? ? ? ? ? ? uploadStr := "


    "

  90. ? ? ? ? ? ? ? ? responseString = responseString + uploadStr + "
  91. "
  92. ? ? ? ? ? ? ? ? //fmt.Println("? ?? ?=+=== responseString: ",responseString)
  93. ? ? ? ? ? ? ? ? _, err = io.WriteString(w, responseString)
  94. ? ? ? ? ? ? ? ? if err != nil {
  95. ? ? ? ? ? ? ? ? ? ? ? ? // panic(err)
  96. ? ? ? ? ? ? ? ? ? ? ? ? http.Redirect(w, req, "", http.StatusInternalServerError)
  97. ? ? ? ? ? ? ? ? ? ? ? ? Logger(req, http.StatusInternalServerError)
  98. ? ? ? ? ? ? ? ? } else {
  99. ? ? ? ? ? ? ? ? ? ? ? ? Logger(req, http.StatusOK)
  100. ? ? ? ? ? ? ? ? }

  101. ? ? ? ? ? ? ? ? upload_path = "./" + req.URL.Path[0:] + "/"

  102. ? ? ? ? ? ? ? ? return
  103. ? ? ? ? }

  104. ? ? ? ? // File exists and is no directory; Serve the file

  105. ? ? ? ? b, err := ioutil.ReadFile(filename)
  106. ? ? ? ? if err != nil {
  107. ? ? ? ? ? ? ? ? http.Redirect(w, req, "", http.StatusInternalServerError)
  108. ? ? ? ? ? ? ? ? Logger(req, http.StatusInternalServerError)
  109. ? ? ? ? ? ? ? ? return
  110. ? ? ? ? }

  111. ? ? ? ? str := string(b)
  112. ? ? ? ? extension := path.Ext(filename)

  113. ? ? ? ? if extension == ".css" {
  114. ? ? ? ? ? ? ? ? w.Header().Set("Content-Type", "text/css; charset=utf-8")
  115. ? ? ? ? } else if extension == ".js" {
  116. ? ? ? ? ? ? ? ? w.Header().Set("Content-Type", "application/javascript; charset=utf-8")
  117. ? ? ? ? }
  118. ? ? ? ? _, err = io.WriteString(w, str)
  119. ? ? ? ? if err != nil {
  120. ? ? ? ? ? ? ? ? // panic(err)
  121. ? ? ? ? ? ? ? ? http.Redirect(w, req, "", http.StatusInternalServerError)
  122. ? ? ? ? } else {
  123. ? ? ? ? ? ? ? ? Logger(req, http.StatusOK)
  124. ? ? ? ? }

  125. }

  126. func main() {

  127. ? ? ? ? defaultPortPtr := flag.String("p", "", "Port Number")
  128. ? ? ? ? defaultPathPtr := flag.String("d", "", "Root Directory")
  129. ? ? ? ? flag.Parse()

  130. ? ? ? ? portNum := "8080"

  131. ? ? ? ? // Handling the command line flags

  132. ? ? ? ? // Directory
  133. ? ? ? ? if *defaultPathPtr != "" {
  134. ? ? ? ? ? ? ? ? defaultPath = "./" + *defaultPathPtr + "/"
  135. ? ? ? ? } else {
  136. ? ? ? ? ? ? ? ? defaultPath = ""
  137. ? ? ? ? }
  138. ? ? ? ? // Port Number
  139. ? ? ? ? if *defaultPortPtr != "" {
  140. ? ? ? ? ? ? ? ? portNum = *defaultPortPtr
  141. ? ? ? ? } else {
  142. ? ? ? ? ? ? ? ? portNum = "8080"
  143. ? ? ? ? }

  144. ? ? ? ? baseURL = "http://localhost:" + portNum

  145. ? ? ? ? fmt.Println("Serving on ", baseURL, " subdirectory ", defaultPath)

  146. ? ? ? ? http.HandleFunc("/", Handler)
  147. ? ? ? ? err := http.ListenAndServe(":"+portNum, nil)
  148. ? ? ? ? if err != nil {
  149. ? ? ? ? ? ? ? ? log.Fatal("ListenAndServe: ", err)
  150. ? ? ? ? }
  151. }
复制代码


沙发
| 2019-9-20 09:14 | 只看该作者
不错的东西。给你点个赞。
板凳
?楼主 | 2019-9-20 09:26 | 只看该作者
海中水 发表于 2019-9-20 09:14
不错的东西。给你点个赞。

可以交叉编译到嵌入式linux环境里:
env GOOS=linux GOARCH=arm go build -v fileserver.go

这样可以很方便为嵌入式环境增加远程查看,更新,下载功能
地板
| 2019-9-20 10:29 | 只看该作者
相当于一个NAS么?
5
?楼主 | 2019-9-20 13:23 | 只看该作者
sherwin 发表于 2019-9-20 10:29
相当于一个NAS么?

可以的
6
| 2019-9-23 09:18 | 只看该作者
keer_zu 发表于 2019-9-20 09:26
可以交叉编译到嵌入式linux环境里:
env GOOS=linux GOARCH=arm go build -v fileserver.go

ok!有空研究一下。
7
| 2019-9-23 16:27 | 只看该作者
为啥不用gin....可以少些不少代码...
8
?楼主 | 2019-9-24 11:42 | 只看该作者
icecut 发表于 2019-9-23 16:27
为啥不用gin....可以少些不少代码...

关键还是文件和路径的问题
9
| 2019-9-25 09:45 | 只看该作者
keer_zu 发表于 2019-9-24 11:42
关键还是文件和路径的问题

这个可以修改的. 你想啊. 很多网页服务器必须对上传的文件进行改名.否则会出现安全问题...改个路径还不简单...
10
?楼主 | 2019-10-4 13:21 | 只看该作者
icecut 发表于 2019-9-25 09:45
这个可以修改的. 你想啊. 很多网页服务器必须对上传的文件进行改名.否则会出现安全问题...改个路径还不简 ...

也用过gin做了webserver,但是没有仔细了解过gin额外提供了那些东西,比如安全方面的。
11
| 2019-10-5 19:00 | 只看该作者
keer_zu 发表于 2019-10-4 13:21
也用过gin做了webserver,但是没有仔细了解过gin额外提供了那些东西,比如安全方面的。 ...

你想的太多了...仅仅是个支持中间件的框架
12
?楼主 | 2019-10-8 09:58 | 只看该作者
icecut 发表于 2019-10-5 19:00
你想的太多了...仅仅是个支持中间件的框架

小i,这是gin版本:


  1. package main

  2. import (
  3. ? ? ? ? "flag"
  4. ? ? ? ? "fmt"
  5. ? ? ? ? "io"
  6. ? ? ? ? "io/ioutil"
  7. ? ? ? ? "log"
  8. ? ? ? ? "net/http"
  9. ? ? ? ? "os"
  10. ? ? ? ? "path"
  11. ? ? ? ? "strconv"
  12. ? ? ? ? "strings"
  13. ? ? ? ? "time"
  14. ? ? ? ? "github.com/gin-gonic/gin"
  15. )

  16. var defaultPath string

  17. var baseURL string
  18. var upload_path string

  19. func Logger(req *http.Request, statusCode int) {
  20. ? ? ? ? const layout = "[ 2/Jan/2006 15:04:05 ]"
  21. ? ? ? ? fmt.Println(baseURL + " --- " + time.Now().Format(layout) + " " + req.Method + "??" + strconv.Itoa(statusCode) + "??" + req.URL.Path)
  22. }

  23. func Handler(w http.ResponseWriter, req *http.Request) {


  24. ? ? ? ? filename := defaultPath + req.URL.Path[1:]
  25. ? ? ? ? fmt.Println("=+=== file name: ",filename)
  26. ? ? ? ? if last := len(filename) - 1; last >= 0 && filename[last] == '/' && len(filename) != 1 {
  27. ? ? ? ? ? ? ? ? filename = filename[:last]
  28. ? ? ? ? }

  29. ? ? ? ? if req.Method == "POST" {
  30. ? ? ? ? ? ? ? ? file, head, err := req.FormFile("file")
  31. ? ? ? ? ? ? ? ? if err != nil {
  32. ? ? ? ? ? ? ? ? ? ? ? ? fmt.Println(err)
  33. ? ? ? ? ? ? ? ? ? ? ? ? return
  34. ? ? ? ? ? ? ? ? }

  35. ? ? ? ? ? ? ? ? defer file.Close()


  36. ? ? ? ? ? ? ? ? //创建文件
  37. ? ? ? ? ? ? ? ? fW, err := os.Create(upload_path + head.Filename)
  38. ? ? ? ? ? ? ? ? if err != nil {
  39. ? ? ? ? ? ? ? ? ? ? ? ? fmt.Println("文件创建失败")
  40. ? ? ? ? ? ? ? ? ? ? ? ? return
  41. ? ? ? ? ? ? ? ? }
  42. ? ? ? ? ? ? ? ? defer fW.Close()

  43. ? ? ? ? ? ? ? ? _, err = io.Copy(fW, file)
  44. ? ? ? ? ? ? ? ? if err != nil {
  45. ? ? ? ? ? ? ? ? ? ? ? ? fmt.Println("文件保存失败")
  46. ? ? ? ? ? ? ? ? ? ? ? ? return
  47. ? ? ? ? ? ? ? ? }
  48. ? ? ? ? }

  49. ? ? ? ? // Empty request (Root)
  50. ? ? ? ? if filename == "" {
  51. ? ? ? ? ? ? ? ? filename = "./"
  52. ? ? ? ? }

  53. ? ? ? ? file, err := os.Stat(filename)

  54. ? ? ? ? // 404 if file doesn't exist
  55. ? ? ? ? if os.IsNotExist(err) {
  56. ? ? ? ? ? ? ? ? _, err = io.WriteString(w, "404 Not Found")
  57. ? ? ? ? ? ? ? ? Logger(req, http.StatusNotFound)
  58. ? ? ? ? ? ? ? ? return
  59. ? ? ? ? }

  60. ? ? ? ? // Serve directory
  61. ? ? ? ? if file.IsDir() {

  62. ? ? ? ? ? ? ? ? slashCheck := ""

  63. ? ? ? ? ? ? ? ? files, err := ioutil.ReadDir(filename)
  64. ? ? ? ? ? ? ? ? // Catch the Error in reading from directory
  65. ? ? ? ? ? ? ? ? if err != nil {
  66. ? ? ? ? ? ? ? ? ? ? ? ? http.Redirect(w, req, "", http.StatusInternalServerError)
  67. ? ? ? ? ? ? ? ? ? ? ? ? Logger(req, http.StatusInternalServerError)
  68. ? ? ? ? ? ? ? ? }
  69. ? ? ? ? ? ? ? ? // Checking for Root Directory
  70. ? ? ? ? ? ? ? ? if filename != "./" {
  71. ? ? ? ? ? ? ? ? ? ? ? ? if filename[len(filename)-1] != '/' {
  72. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? slashCheck = "/"
  73. ? ? ? ? ? ? ? ? ? ? ? ? }
  74. ? ? ? ? ? ? ? ? }

  75. ? ? ? ? ? ? ? ? fmt.Println("=+=== slashCheck: ",slashCheck)
  76. ? ? ? ? ? ? ? ? fmt.Println("=+=== req.URL.Path[0:]: ",req.URL.Path[0:])

  77. ? ? ? ? ? ? ? ? responseString := "

    Directory Listing for " + req.URL.Path[1:] + "/



      "
    • ? ? ? ? ? ? ? ? for _, f := range files {
    • ? ? ? ? ? ? ? ? ? ? ? ? if f.Name()[0] != '.' {
    • ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if f.IsDir() {
    • ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? responseString += "
    • " + f.Name() + "/" + "
    • "
    • ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? } else {
    • ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? responseString += "
    • " + f.Name() + "
    • "
    • ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
    • ? ? ? ? ? ? ? ? ? ? ? ? }
    • ? ? ? ? ? ? ? ? }

    • ? ? ? ? ? ? ? ? //Ending the list
    • ? ? ? ? ? ? ? ? responseString += "


    "

  78. ? ? ? ? ? ? ? ? p := req.URL.Path

  79. ? ? ? ? ? ? ? ? // Display link to parent directory
  80. ? ? ? ? ? ? ? ? if len(p) > 1 {
  81. ? ? ? ? ? ? ? ? ? ? ? ? base := path.Base(p)

  82. ? ? ? ? ? ? ? ? ? ? ? ? slice := len(p) - len(base) - 1

  83. ? ? ? ? ? ? ? ? ? ? ? ? url := "/"

  84. ? ? ? ? ? ? ? ? ? ? ? ? if slice > 1 {
  85. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? url = req.URL.Path[:slice]
  86. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? url = strings.TrimRight(url, "/") // Remove extra / at the end
  87. ? ? ? ? ? ? ? ? ? ? ? ? }

  88. ? ? ? ? ? ? ? ? ? ? ? ? responseString += "
    Parent directory"
  89. ? ? ? ? ? ? ? ? }

  90. ? ? ? ? ? ? ? ? uploadStr := "


    "

  91. ? ? ? ? ? ? ? ? responseString = responseString + uploadStr + "
  92. "
  93. ? ? ? ? ? ? ? ? //fmt.Println("? ?? ?=+=== responseString: ",responseString)
  94. ? ? ? ? ? ? ? ? _, err = io.WriteString(w, responseString)
  95. ? ? ? ? ? ? ? ? if err != nil {
  96. ? ? ? ? ? ? ? ? ? ? ? ? // panic(err)
  97. ? ? ? ? ? ? ? ? ? ? ? ? http.Redirect(w, req, "", http.StatusInternalServerError)
  98. ? ? ? ? ? ? ? ? ? ? ? ? Logger(req, http.StatusInternalServerError)
  99. ? ? ? ? ? ? ? ? } else {
  100. ? ? ? ? ? ? ? ? ? ? ? ? Logger(req, http.StatusOK)
  101. ? ? ? ? ? ? ? ? }

  102. ? ? ? ? ? ? ? ? upload_path = "./" + req.URL.Path[0:] + "/"

  103. ? ? ? ? ? ? ? ? return
  104. ? ? ? ? }

  105. ? ? ? ? // File exists and is no directory; Serve the file

  106. ? ? ? ? b, err := ioutil.ReadFile(filename)
  107. ? ? ? ? if err != nil {
  108. ? ? ? ? ? ? ? ? http.Redirect(w, req, "", http.StatusInternalServerError)
  109. ? ? ? ? ? ? ? ? Logger(req, http.StatusInternalServerError)
  110. ? ? ? ? ? ? ? ? return
  111. ? ? ? ? }

  112. ? ? ? ? str := string(b)
  113. ? ? ? ? extension := path.Ext(filename)

  114. ? ? ? ? if extension == ".css" {
  115. ? ? ? ? ? ? ? ? w.Header().Set("Content-Type", "text/css; charset=utf-8")
  116. ? ? ? ? } else if extension == ".js" {
  117. ? ? ? ? ? ? ? ? w.Header().Set("Content-Type", "application/javascript; charset=utf-8")
  118. ? ? ? ? }
  119. ? ? ? ? _, err = io.WriteString(w, str)
  120. ? ? ? ? if err != nil {
  121. ? ? ? ? ? ? ? ? // panic(err)
  122. ? ? ? ? ? ? ? ? http.Redirect(w, req, "", http.StatusInternalServerError)
  123. ? ? ? ? } else {
  124. ? ? ? ? ? ? ? ? Logger(req, http.StatusOK)
  125. ? ? ? ? }

  126. }


  127. func FileServerGet(c *gin.Context) {
  128. ? ? ? ?
  129. ? ? ? ? filename := defaultPath + c.Request.URL.Path[1:]
  130. ? ? ? ? fmt.Println("=+=== file name: ",filename)
  131. ? ? ? ? if last := len(filename) - 1; last >= 0 && filename[last] == '/' && len(filename) != 1 {
  132. ? ? ? ? ? ? ? ? filename = filename[:last]
  133. ? ? ? ? }

  134. ? ? ? ? // Empty request (Root)
  135. ? ? ? ? if filename == "" {
  136. ? ? ? ? ? ? ? ? filename = "./"
  137. ? ? ? ? }

  138. ? ? ? ? file, err := os.Stat(filename)

  139. ? ? ? ? // 404 if file doesn't exist
  140. ? ? ? ? if os.IsNotExist(err) {
  141. ? ? ? ? ? ? ? ? _, err = io.WriteString(c.Writer, "404 Not Found")
  142. ? ? ? ? ? ? ? ? //Logger(c.Request, http.StatusNotFound)
  143. ? ? ? ? ? ? ? ? return
  144. ? ? ? ? }

  145. // Serve directory
  146. ? ? ? ? if file.IsDir() {

  147. ? ? ? ? ? ? ? ? slashCheck := ""

  148. ? ? ? ? ? ? ? ? files, err := ioutil.ReadDir(filename)
  149. ? ? ? ? ? ? ? ? // Catch the Error in reading from directory
  150. ? ? ? ? ? ? ? ? if err != nil {
  151. ? ? ? ? ? ? ? ? ? ? ? ? http.Redirect(c.Writer, c.Request, "", http.StatusInternalServerError)
  152. ? ? ? ? ? ? ? ? ? ? ? ? //Logger(c.Request, http.StatusInternalServerError)
  153. ? ? ? ? ? ? ? ? }
  154. ? ? ? ? ? ? ? ? // Checking for Root Directory
  155. ? ? ? ? ? ? ? ? if filename != "./" {
  156. ? ? ? ? ? ? ? ? ? ? ? ? if filename[len(filename)-1] != '/' {
  157. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? slashCheck = "/"
  158. ? ? ? ? ? ? ? ? ? ? ? ? }
  159. ? ? ? ? ? ? ? ? }

  160. ? ? ? ? ? ? ? ? fmt.Println("=+=== slashCheck: ",slashCheck)
  161. ? ? ? ? ? ? ? ? fmt.Println("=+=== c.Request.URL.Path[0:]: ",c.Request.URL.Path[0:])

  162. ? ? ? ? ? ? ? ? responseString := "

    Directory Listing for " + c.Request.URL.Path[1:] + "/



      "
    • ? ? ? ? ? ? ? ? for _, f := range files {
    • ? ? ? ? ? ? ? ? ? ? ? ? if f.Name()[0] != '.' {
    • ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if f.IsDir() {
    • ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? responseString += "
    • " + f.Name() + "/" + "
    • "
    • ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? } else {
    • ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? responseString += "
    • " + f.Name() + "
    • "
    • ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
    • ? ? ? ? ? ? ? ? ? ? ? ? }
    • ? ? ? ? ? ? ? ? }

    • ? ? ? ? ? ? ? ? //Ending the list
    • ? ? ? ? ? ? ? ? responseString += "


    "

  163. ? ? ? ? ? ? ? ? p := c.Request.URL.Path

  164. ? ? ? ? ? ? ? ? // Display link to parent directory
  165. ? ? ? ? ? ? ? ? if len(p) > 1 {
  166. ? ? ? ? ? ? ? ? ? ? ? ? base := path.Base(p)

  167. ? ? ? ? ? ? ? ? ? ? ? ? slice := len(p) - len(base) - 1

  168. ? ? ? ? ? ? ? ? ? ? ? ? url := "/"

  169. ? ? ? ? ? ? ? ? ? ? ? ? if slice > 1 {
  170. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? url = c.Request.URL.Path[:slice]
  171. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? url = strings.TrimRight(url, "/") // Remove extra / at the end
  172. ? ? ? ? ? ? ? ? ? ? ? ? }

  173. ? ? ? ? ? ? ? ? ? ? ? ? responseString += "
    Parent directory"
  174. ? ? ? ? ? ? ? ? }

  175. ? ? ? ? ? ? ? ? uploadStr := "


    "

  176. ? ? ? ? ? ? ? ? responseString = responseString + uploadStr + "
  177. "
  178. ? ? ? ? ? ? ? ? //fmt.Println("? ?? ?=+=== responseString: ",responseString)
  179. ? ? ? ? ? ? ? ? _, err = io.WriteString(c.Writer, responseString)
  180. ? ? ? ? ? ? ? ? if err != nil {
  181. ? ? ? ? ? ? ? ? ? ? ? ? // panic(err)
  182. ? ? ? ? ? ? ? ? ? ? ? ? http.Redirect(c.Writer, c.Request, "", http.StatusInternalServerError)
  183. ? ? ? ? ? ? ? ? ? ? ? ? //Logger(c.Request, http.StatusInternalServerError)
  184. ? ? ? ? ? ? ? ? } else {
  185. ? ? ? ? ? ? ? ? ? ? ? ? //Logger(c.Request, http.StatusOK)
  186. ? ? ? ? ? ? ? ? }

  187. ? ? ? ? ? ? ? ? upload_path = "./" + c.Request.URL.Path[0:] + "/"

  188. ? ? ? ? ? ? ? ? return
  189. ? ? ? ? }

  190. ? ? ? ? // File exists and is no directory; Serve the file

  191. ? ? ? ? b, err := ioutil.ReadFile(filename)
  192. ? ? ? ? if err != nil {
  193. ? ? ? ? ? ? ? ? http.Redirect(c.Writer, c.Request, "", http.StatusInternalServerError)
  194. ? ? ? ? ? ? ? ? //Logger(c.Request, http.StatusInternalServerError)
  195. ? ? ? ? ? ? ? ? return
  196. ? ? ? ? }

  197. ? ? ? ? str := string(b)
  198. ? ? ? ? extension := path.Ext(filename)

  199. ? ? ? ? if extension == ".css" {
  200. ? ? ? ? ? ? ? ? c.Writer.Header().Set("Content-Type", "text/css; charset=utf-8")
  201. ? ? ? ? } else if extension == ".js" {
  202. ? ? ? ? ? ? ? ? c.Writer.Header().Set("Content-Type", "application/javascript; charset=utf-8")
  203. ? ? ? ? }
  204. ? ? ? ? _, err = io.WriteString(c.Writer, str)
  205. ? ? ? ? if err != nil {
  206. ? ? ? ? ? ? ? ? // panic(err)
  207. ? ? ? ? ? ? ? ? http.Redirect(c.Writer, c.Request, "", http.StatusInternalServerError)
  208. ? ? ? ? } else {
  209. ? ? ? ? ? ? ? ? //Logger(c.Request, http.StatusOK)
  210. ? ? ? ? }
  211. }

  212. func FileServerPost(c *gin.Context) {
  213. ? ? ? ? file, head, err := c.Request.FormFile ("file")
  214. ? ? ? ? if err != nil {
  215. ? ? ? ? ? ? ? ? fmt.Println(err)
  216. ? ? ? ? ? ? ? ? return
  217. ? ? ? ? }

  218. ? ? ? ? defer file.Close()


  219. ? ? ? ? //创建文件
  220. ? ? ? ? fW, err := os.Create(upload_path + head.Filename)
  221. ? ? ? ? if err != nil {
  222. ? ? ? ? ? ? ? ? fmt.Println("文件创建失败")
  223. ? ? ? ? ? ? ? ? return
  224. ? ? ? ? }
  225. ? ? ? ? defer fW.Close()

  226. ? ? ? ? _, err = io.Copy(fW, file)
  227. ? ? ? ? if err != nil {
  228. ? ? ? ? ? ? ? ? fmt.Println("文件保存失败")
  229. ? ? ? ? ? ? ? ? return
  230. ? ? ? ? }
  231. }

  232. func main() {

  233. ? ? ? ? router := gin.Default()
  234. ? ? ? ? router.GET("/",FileServerGet)
  235. ? ? ? ? router.POST("/",FileServerPost)


  236. ? ? ? ? defaultPortPtr := flag.String("p", "", "Port Number")
  237. ? ? ? ? defaultPathPtr := flag.String("d", "", "Root Directory")
  238. ? ? ? ? flag.Parse()

  239. ? ? ? ? portNum := "8080"

  240. ? ? ? ? // Handling the command line flags

  241. ? ? ? ? // Directory
  242. ? ? ? ? if *defaultPathPtr != "" {
  243. ? ? ? ? ? ? ? ? defaultPath = "./" + *defaultPathPtr + "/"
  244. ? ? ? ? } else {
  245. ? ? ? ? ? ? ? ? defaultPath = ""
  246. ? ? ? ? }
  247. ? ? ? ? // Port Number
  248. ? ? ? ? if *defaultPortPtr != "" {
  249. ? ? ? ? ? ? ? ? portNum = *defaultPortPtr
  250. ? ? ? ? } else {
  251. ? ? ? ? ? ? ? ? portNum = "8080"
  252. ? ? ? ? }

  253. ? ? ? ? baseURL = "http://localhost:" + portNum

  254. ? ? ? ? fmt.Println("Serving on ", baseURL, " subdirectory ", defaultPath)
  255. /*
  256. ? ? ? ? http.HandleFunc("/", Handler)
  257. ? ? ? ? err := http.ListenAndServe(":"+portNum, nil)
  258. ? ? ? ? if err != nil {
  259. ? ? ? ? ? ? ? ? log.Fatal("ListenAndServe: ", err)
  260. ? ? ? ? }
  261. ? ? ? ? */
  262. ? ? ? ? err := http.ListenAndServe(":" + portNum, router)
  263. ? ? ? ? if err != nil {
  264. ? ? ? ? ? ? ? ? log.Fatal("ListenAndServe: ", err)
  265. ? ? ? ? }
  266. }
复制代码
@海中水 @gaoyang9992006 @sherwin
13
| 2019-10-8 17:40 | 只看该作者
// Static serves files from the given file system root.
// Internally a http.FileServer is used, therefore http.NotFound is used instead
// of the Router's NotFound handler.
// To use the operating system's file system implementation,
// use :
//? ???router.Static("/static", "/var/www")
func (group *RouterGroup) Static(relativePath, root string) IRoutes {
? ? ? ? return group.StaticFS(relativePath, Dir(root, false))
}
看上面的函数注释.
14
| 2019-10-8 17:40 | 只看该作者
func main() {
? ? ? ? router := gin.Default()
? ? ? ? // 为 multipart forms 设置较低的内存限制 (默认是 32 MiB)
? ? ? ? // router.MaxMultipartMemory = 8 << 20??// 8 MiB
? ? ? ? router.POST("/upload", func(c *gin.Context) {
? ? ? ? ? ? ? ? // 单文件
? ? ? ? ? ? ? ? file, _ := c.FormFile("file")
? ? ? ? ? ? ? ? log.Println(file.Filename)

? ? ? ? ? ? ? ? // 上传文件至指定目录
? ? ? ? ? ? ? ? // c.SaveUploadedFile(file, dst)

? ? ? ? ? ? ? ? c.String(http.StatusOK, fmt.Sprintf("'%s' uploaded!", file.Filename))
? ? ? ? })
? ? ? ? router.Run(":8080")
}
15
| 2019-10-8 17:42 | 只看该作者
func main() {
? ? ? ? router := gin.Default()
? ? ? ? router.Static("/assets", "./assets")
? ? ? ? router.StaticFS("/more_static", http.Dir("my_file_system"))
? ? ? ? router.StaticFile("/favicon.ico", "./resources/favicon.ico")

? ? ? ? // 监听并在 0.0.0.0:8080 上启动服务
? ? ? ? router.Run(":8080")
}
下载.

文件浏览需要自己写.官方没有
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

关闭

热门推荐上一条 /6 下一条

在线客服 快速回复 返回顶部 返回列表