文件服务器论坛,golang的一个文件服务器

package main

import (

"flag"

"fmt"

"io"

"io/ioutil"

"log"

"net/http"

"os"

"path"

"strconv"

"strings"

"time"

"github.com/gin-gonic/gin"

)

var defaultPath string

var baseURL string

var upload_path string

func Logger(req *http.Request, statusCode int) {

const layout = "[ 2/Jan/2006 15:04:05 ]"

fmt.Println(baseURL + " --- " + time.Now().Format(layout) + " " + req.Method + "  " + strconv.Itoa(statusCode) + "  " + req.URL.Path)

}

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

filename := defaultPath + req.URL.Path[1:]

fmt.Println("=+=== file name: ",filename)

if last := len(filename) - 1; last >= 0 && filename[last] == '/' && len(filename) != 1 {

filename = filename[:last]

}

if req.Method == "POST" {

file, head, err := req.FormFile("file")

if err != nil {

fmt.Println(err)

return

}

defer file.Close()

//创建文件

fW, err := os.Create(upload_path + head.Filename)

if err != nil {

fmt.Println("文件创建失败")

return

}

defer fW.Close()

_, err = io.Copy(fW, file)

if err != nil {

fmt.Println("文件保存失败")

return

}

}

// Empty request (Root)

if filename == "" {

filename = "./"

}

file, err := os.Stat(filename)

// 404 if file doesn't exist

if os.IsNotExist(err) {

_, err = io.WriteString(w, "404 Not Found")

Logger(req, http.StatusNotFound)

return

}

// Serve directory

if file.IsDir() {

slashCheck := ""

files, err := ioutil.ReadDir(filename)

// Catch the Error in reading from directory

if err != nil {

http.Redirect(w, req, "", http.StatusInternalServerError)

Logger(req, http.StatusInternalServerError)

}

// Checking for Root Directory

if filename != "./" {

if filename[len(filename)-1] != '/' {

slashCheck = "/"

}

}

fmt.Println("=+=== slashCheck: ",slashCheck)

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

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 += "


"

p := req.URL.Path

// Display link to parent directory

if len(p) > 1 {

base := path.Base(p)

slice := len(p) - len(base) - 1

url := "/"

if slice > 1 {

url = req.URL.Path[:slice]

url = strings.TrimRight(url, "/") // Remove extra / at the end

}

responseString += "Parent directory"

}

uploadStr := "

"

responseString = responseString + uploadStr + ""

//fmt.Println("      =+=== responseString: ",responseString)

_, err = io.WriteString(w, responseString)

if err != nil {

// panic(err)

http.Redirect(w, req, "", http.StatusInternalServerError)

Logger(req, http.StatusInternalServerError)

} else {

Logger(req, http.StatusOK)

}

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

return

}

// File exists and is no directory; Serve the file

b, err := ioutil.ReadFile(filename)

if err != nil {

http.Redirect(w, req, "", http.StatusInternalServerError)

Logger(req, http.StatusInternalServerError)

return

}

str := string(b)

extension := path.Ext(filename)

if extension == ".css" {

w.Header().Set("Content-Type", "text/css; charset=utf-8")

} else if extension == ".js" {

w.Header().Set("Content-Type", "application/javascript; charset=utf-8")

}

_, err = io.WriteString(w, str)

if err != nil {

// panic(err)

http.Redirect(w, req, "", http.StatusInternalServerError)

} else {

Logger(req, http.StatusOK)

}

}

func FileServerGet(c *gin.Context) {

filename := defaultPath + c.Request.URL.Path[1:]

fmt.Println("=+=== file name: ",filename)

if last := len(filename) - 1; last >= 0 && filename[last] == '/' && len(filename) != 1 {

filename = filename[:last]

}

// Empty request (Root)

if filename == "" {

filename = "./"

}

file, err := os.Stat(filename)

// 404 if file doesn't exist

if os.IsNotExist(err) {

_, err = io.WriteString(c.Writer, "404 Not Found")

//Logger(c.Request, http.StatusNotFound)

return

}

// Serve directory

if file.IsDir() {

slashCheck := ""

files, err := ioutil.ReadDir(filename)

// Catch the Error in reading from directory

if err != nil {

http.Redirect(c.Writer, c.Request, "", http.StatusInternalServerError)

//Logger(c.Request, http.StatusInternalServerError)

}

// Checking for Root Directory

if filename != "./" {

if filename[len(filename)-1] != '/' {

slashCheck = "/"

}

}

fmt.Println("=+=== slashCheck: ",slashCheck)

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

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 += "


"

p := c.Request.URL.Path

// Display link to parent directory

if len(p) > 1 {

base := path.Base(p)

slice := len(p) - len(base) - 1

url := "/"

if slice > 1 {

url = c.Request.URL.Path[:slice]

url = strings.TrimRight(url, "/") // Remove extra / at the end

}

responseString += "Parent directory"

}

uploadStr := "

"

responseString = responseString + uploadStr + ""

//fmt.Println("      =+=== responseString: ",responseString)

_, err = io.WriteString(c.Writer, responseString)

if err != nil {

// panic(err)

http.Redirect(c.Writer, c.Request, "", http.StatusInternalServerError)

//Logger(c.Request, http.StatusInternalServerError)

} else {

//Logger(c.Request, http.StatusOK)

}

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

return

}

// File exists and is no directory; Serve the file

b, err := ioutil.ReadFile(filename)

if err != nil {

http.Redirect(c.Writer, c.Request, "", http.StatusInternalServerError)

//Logger(c.Request, http.StatusInternalServerError)

return

}

str := string(b)

extension := path.Ext(filename)

if extension == ".css" {

c.Writer.Header().Set("Content-Type", "text/css; charset=utf-8")

} else if extension == ".js" {

c.Writer.Header().Set("Content-Type", "application/javascript; charset=utf-8")

}

_, err = io.WriteString(c.Writer, str)

if err != nil {

// panic(err)

http.Redirect(c.Writer, c.Request, "", http.StatusInternalServerError)

} else {

//Logger(c.Request, http.StatusOK)

}

}

func FileServerPost(c *gin.Context) {

file, head, err := c.Request.FormFile ("file")

if err != nil {

fmt.Println(err)

return

}

defer file.Close()

//创建文件

fW, err := os.Create(upload_path + head.Filename)

if err != nil {

fmt.Println("文件创建失败")

return

}

defer fW.Close()

_, err = io.Copy(fW, file)

if err != nil {

fmt.Println("文件保存失败")

return

}

}

func main() {

router := gin.Default()

router.GET("/",FileServerGet)

router.POST("/",FileServerPost)

defaultPortPtr := flag.String("p", "", "Port Number")

defaultPathPtr := flag.String("d", "", "Root Directory")

flag.Parse()

portNum := "8080"

// Handling the command line flags

// Directory

if *defaultPathPtr != "" {

defaultPath = "./" + *defaultPathPtr + "/"

} else {

defaultPath = ""

}

// Port Number

if *defaultPortPtr != "" {

portNum = *defaultPortPtr

} else {

portNum = "8080"

}

baseURL = "http://localhost:" + portNum

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

/*

http.HandleFunc("/", Handler)

err := http.ListenAndServe(":"+portNum, nil)

if err != nil {

log.Fatal("ListenAndServe: ", err)

}

*/

err := http.ListenAndServe(":" + portNum, router)

if err != nil {

log.Fatal("ListenAndServe: ", err)

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
鉴于你提供的资料中没有明确的问题,我将基于提供的引用内容为你提供一个回答。 引用中提到了一个使用golang实现的文件服务,包括上传和下载功能的服务器端和客户端。这个文件服务可以用于在客户端显示图片列表,并且保护文件服务器的地址不被暴露出来。具体实现的代码可以参考引用中的示例,其中使用了`os.Args`来获取当前可执行程序的路径,并通过`http.Handle()`和`http.ListenAndServe()`开启了一个文件服务器监听在8088端口。所以,如果你想实现一个golang文件服务器,你可以参考这个示例代码。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [golang 文件服务器](https://blog.csdn.net/weixin_31211703/article/details/119474361)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [golang文件服务器的两种方式(可以访问任何目录)](https://blog.csdn.net/n_fly/article/details/115495514)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值